一个简单的配置实现es全文检索支持

简介: 在es的使用过程中,全文搜索属于一个常见的场景,特别是当我们将es作为日志存储检索来使用时,根据关键字查询对应的日志信息,可以怎么处理呢?

在es的使用过程中,全文搜索属于一个常见的场景,特别是当我们将es作为日志存储检索来使用时,根据关键字查询对应的日志信息,可以怎么处理呢?


1. 动态模板结合copy_to方式



在创建索引的时候,我们新增一个allColumnValue的字段,将所有其他的column值都拷贝过去,然后针对这个字段进行检索,即可以实现全文的搜索方式了


这里借助dynamic_templtes来实现上面的自动拷贝逻辑,因此我们可以如下创建一个索引


PUT search_all_demo 
{
  "mappings": {
    "dynamic_templates" : [
        {
          "copy_to_allcolumnvalue" : {
            "match_mapping_type" : "*",
            "mapping" : {
              "copy_to" : "allColumnValue",
              "ignore_above" : 512,
              "type" : "keyword"
            }
          }
        }
    ],
    "properties": {
      "allColumnValue" : {
          "type" : "text"
        }
    }
  }
}
复制代码


创建上面的映射表时,两个点


  • allColumnValue:字段
  • dynamic_templates: 实现字段拷贝


接下来写入一个数据进行测试


POST search_all_demo/_doc
{
  "name": "一灰灰",
  "site": "www.hhui.top",
  "title": "java developer"
}
复制代码


然后检索一下是否可以查询到希望的结果


GET search_all_demo/_search
{
  "query": {
    "match": {
      "allColumnValue": "灰灰"
    }
  }
}
复制代码


上面这个查询之后,正常会命中我们的数据,并返回


{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.7911257,
    "hits" : [
      {
        "_index" : "search_all_demo",
        "_type" : "_doc",
        "_id" : "1FoBk3wB-kdeh8MF_IbL",
        "_score" : 0.7911257,
        "_source" : {
          "name" : "一灰灰",
          "site" : "www.hhui.top",
          "title" : "java developer"
        }
      }
    ]
  }
}
复制代码


注意

使用上面这种配置时,对于Field有要求,当我们制定一个Map类型时,会失败


POST search_all_demo/_doc
{
  "name": "一灰",
  "site": "blog.hhui.top",
  "ddd": {
    "user": "yihui",
    "pwd": "yihui"
  }
}
复制代码


上面的ddd会提示异常


{
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse field [ddd] of type [keyword] in document with id '11qek3wB-kdeh8MFm4bN'. Preview of field's value: '{pwd=yihui, user=yihui}'"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "failed to parse field [ddd] of type [keyword] in document with id '11qek3wB-kdeh8MFm4bN'. Preview of field's value: '{pwd=yihui, user=yihui}'",
    "caused_by" : {
      "type" : "illegal_state_exception",
      "reason" : "Can't get text on a START_OBJECT at 4:10"
    }
  },
  "status" : 400
}
复制代码


2. 部分字段组合搜索



上面介绍的是全量的数据凭借到allColumnValue,从而实现全文检索;可能在实际的场景中,我只是希望对部分的field进行联合检索,基于此可以如下设置


PUT search_union_demo 
{
  "mappings": {
    "properties": {
      "allColumnValue" : {
          "type" : "text"
        },
        "name": {
          "type" : "keyword",
          "ignore_above" : 512,
          "copy_to" : [
            "allColumnValue"
          ]
        },
         "site" : {
          "type" : "keyword",
          "ignore_above" : 512,
          "copy_to" : [
            "allColumnValue"
          ]
        }
    }
  }
}
复制代码


新增两个数据


POST search_union_demo/_doc
{
  "name": "test",
  "site": "spring.hhui.top",
  "ddd": {
    "user": "一灰",
    "pwd": "yihui"
  }
}
POST search_union_demo/_doc
{
  "name": "一灰",
  "site": "blog.hhui.top",
  "ddd": {
    "user": "yihui",
    "pwd": "yihui"
  }
}
复制代码


然后我们检索一灰时,可以查到第二条数据

GET search_union_demo/_search
{
  "query": {
    "match": {
      "allColumnValue": "一灰"
    }
  }
}
复制代码


输出结果

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.2814486,
    "hits" : [
      {
        "_index" : "search_union_demo",
        "_type" : "_doc",
        "_id" : "2Fqjk3wB-kdeh8MFy4aC",
        "_score" : 1.2814486,
        "_source" : {
          "name" : "一灰",
          "site" : "blog.hhui.top",
          "ddd" : {
            "user" : "yihui",
            "pwd" : "yihui"
          }
        }
      }
    ]
  }
}
复制代码


3. 小结



本文主要介绍借助copy_to,来实现es的联合/全文搜索的功能;通过简单的设置,来支撑更友好的查询场景



相关文章
|
前端开发 API
ES 高级实战(四)查询 ES 数据
ES 高级实战(四)查询 ES 数据
1363 0
ES 高级实战(四)查询 ES 数据
|
10月前
|
JSON 自然语言处理 数据格式
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
179 0
|
存储 搜索推荐 数据可视化
|
XML 搜索推荐 安全
lucene、solr、es的区别以及应用场景
@[TOC](目录) Lucene、Solr 和 Elasticsearch(ES) 都是基于 Lucene 引擎的搜索引擎,它们之间有相似之处,但也有一些不同之处。 Lucene 是一个低级别的搜索引擎库,它提供了一种用于创建和维护全文索引的 API,以及一些搜索和排序算法。Lucene 主要用于构建自定义搜索引擎,例如在 Java 应用程序中使用。 Solr 是 Lucene 的一个扩展,它提供了一个完整的搜索引擎框架,包括了索引、搜索、排序、过滤等功能。Solr 旨在为大规模数据集提供高性能的全文搜索功能,因此它支持分布式搜索、实时搜索和自定义排序和过滤器等功能。 Elasticsear
289 0
ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)
在前面关于ES的一系列文章中,已经介绍了ES的概念、常用操作、JavaAPI以及实际的一个小demo,但是在真实的应用场景中,还有可能会有更高阶的一些用法,今天主要介绍两种相对来说会更难一些的操作,聚合查询。该文档基于ElasticSearch7.6,将介绍restful查询语法以及JavaApi。 阅读本文需要你有ElasticSearch的基础。
|
存储 搜索推荐 数据可视化
一.全文检索ElasticSearch经典入门-全文索引&ES概述&ES安装&Kibana安装
一.全文检索ElasticSearch经典入门-全文索引&ES概述&ES安装&Kibana安装
|
SQL JSON 自然语言处理
ElasticSearch中DSL高级检索(Query)
ElasticSearch中DSL高级检索(Query) es分布式搜索引擎 作用:搜索 全文检索 ES官方提供了两中检索方式:一种是通过 URL 参数进行搜索,另一种是通过 DSL(Domain Specified Language) 进行搜索``。``官方更推荐使用第二种方式第二种方式是基于传递JSON作为请求体(request body)格式与ES进行交互,这种方式更强大,更简洁``。
222 0
ElasticSearch中DSL高级检索(Query)
|
存储 JSON 自然语言处理
ElasticSearch 学习笔记(三)-----ES的设计原理以及分词器说明
接上一篇《ElasticSearch 学习笔记(二)-----Elasticsearch的简介以及应用》,这篇,我们来学习ElasticSearch中的两个重要知识点,设计原理与分词器。
208 0
ElasticSearch 学习笔记(三)-----ES的设计原理以及分词器说明
|
存储 自然语言处理 搜索推荐
【es】elasticsearch/es搜索服务器介绍
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
717 0
【es】elasticsearch/es搜索服务器介绍
|
SQL 自然语言处理 关系型数据库
ES中如何实现like模糊查询
ES中如何实现like模糊查询
2151 0
ES中如何实现like模糊查询