> 技术文档 > Elasticsearch-模糊查询_elasticsearch 模糊查询

Elasticsearch-模糊查询_elasticsearch 模糊查询


模糊查询

  • 前缀搜索:prefix

    概念:以xx开头的搜索,不计算相关度评分。
    注意:
    • 前缀搜索匹配的是term,而不是field。

    • 前缀搜索的性能很差

    • 前缀搜索没有缓存

    • 前缀搜索尽可能把前缀长度设置的更长

      语法:
      GET <index>/_search{  \"query\": {   \"prefix\": {   \"\": {   \"value\": \"\" } }}}index_prefixes: 默认 \"min_chars\" : 2, \"max_chars\" : 5 
PUT my_index{  \"mappings\": {  \"properties\": {  \"text\": {  \"analyzer\": \"ik_max_word\", \"type\": \"text\", \"index_prefixes\":{  \"min_chars\":2, \"max_chars\":4 }, \"fields\": {  \"keyword\": {  \"type\": \"keyword\", \"ignore_above\": 256 } } } } }}

PUT my_index的含义是向Elasticsearch发送一个PUT请求来创建一个名为“my_index”的索引。
在Elasticsearch中,索引是用于存储和检索数据的容器。每个索引都有一个或多个映射(mapping),这些映射定义了索引中字段的类型、分析器、字段属性等。在提供的JSON中,“mappings\"字段的作用是指定索引的映射定义。它定义了索引中包含的字段及其属性。
在\"properties\"字段下,定义了一个名为\"text\"的字段。该字段的配置如下:
“analyzer”: “ik_max_word”:指定使用\"ik_max_word\"分析器,这是一个用于中文分词的分析器。
“type”: “text”:字段类型设置为\"text”,表示这是一个文本字段,可以用于全文搜索。
“index_prefixes”:定义了前缀搜索的参数,其中\"min_chars\"和\"max_chars\"分别表示最小和最大前缀长度。
“fields”:定义了多重字段(multi-fields),即一个字段可以有多个不同的表示。在这里,定义了一个名为\"keyword\"的子字段,其类型为\"keyword\",表示这是一个不分析的字段,通常用于精确匹配和排序。
\"ik_max_word\"是IK分词器的一个变种,用于中文分词。它试图将文本尽可能细粒度地分割成单词,以提供更好的全文搜索效果。
\"index_prefixes\"和\"fields\"的用途是提供对文本字段的额外索引方式。例如,\"index_prefixes\"使得可以使用前缀搜索,而\"fields\"中的\"keyword\"子字段使得可以进行精确匹配和排序,而不是基于分析器的全文搜索。
综合上述配置,这个映射定义了一个名为\"text\"的文本字段,该字段使用\"ik_max_word\"分析器进行中文分词,并提供了前缀搜索和精确匹配的不同索引方式。

GET my_index/_mappingPOST /my_index/_bulk?filter_path=items.*.error{ \"index\":{ \"_id\":\"1\"}}{ \"text\":\"城管打电话喊商贩去摆摊摊\"}{ \"index\":{ \"_id\":\"2\"}}{ \"text\":\"笑果文化回应商贩老农去摆摊\"}{ \"index\":{ \"_id\":\"3\"}}{ \"text\":\"老农耗时17年种出椅子树\"}{ \"index\":{ \"_id\":\"4\"}}{ \"text\":\"夫妻结婚30多年AA制,被城管抓\"}{ \"index\":{ \"_id\":\"5\"}}{ \"text\":\"黑人见义勇为阻止抢劫反被铐住\"}GET my_index/_searchGET my_index/_mappingGET _analyze{  \"analyzer\": \"ik_max_word\", \"text\": [\"城管打电话喊商贩去摆摊摊\"]}GET my_index/_search{  \"query\": {  \"prefix\": {  \"text\": {  \"value\": \"摊摊\" } } }}
  • 通配符:wildcard

    概念:通配符运算符是匹配一个或多个字符的占位符。例如,*通配符运算符匹配零个或多个字符。您可以将通配符运算符与其他字符结合使用以创建通配符模式。
    注意:
    • 通配符匹配的也是term,而不是field

      语法:
      GET <index>/_search{  \"query\": {   \"wildcard\": {   \"\": {   \"value\": \"\" } }}}
# 通配符DELETE my_indexPOST /my_index/_bulk{  \"index\": {  \"_id\": \"1\"}