欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > ElasticSearch7.x入门教程之全文搜索(六)

ElasticSearch7.x入门教程之全文搜索(六)

2025/4/19 17:23:15 来源:https://blog.csdn.net/qq_39853669/article/details/144139211  浏览:    关键词:ElasticSearch7.x入门教程之全文搜索(六)

文章目录

  • 前言
  • 一、短语匹配:match_phrase query
  • 二、短语前缀匹配:~~match_phrase_prefix~~ query
  • 三、多字段查询:multi_match query
  • 四、Lucene中的简单查询
  • 五、存在查询:exists query
  • 六、前缀查询:~~prefix~~ query
  • 七、通配符查询:wildcard query
  • 八、正则表达式查询:regexp query
  • 九、错字模糊查询:fuzzy query
  • 总结


前言

上一篇文章记录了,在工作当中常用的基本查询方式,也可以满足一定的查询需求了。但是有一些特殊场景,可能还不满足,所以在此记录一下。


一、短语匹配:match_phrase query

match_phrase query 也会对查询的关键字进行分词,但是它分词后有两个特点:

1、分词后的词项顺序必须和文档中词项的顺序一致
2、所有的词都必须出现在文档中

示例如下:

GET /building_info/_search  
{"query": {"match_phrase": {"address": {"query": "草堂北路","slop": 7}}}
}

query 是查询的关键字,会被分词器进行分解,分解之后去倒排索引中进行匹配。

slop 是指关键字之间的最小距离,但是注意不是关键之间间隔的字数。文档中的字段被分词器解析之后,解析出来的词项都包含一个 position 字段表示词项的位置,查询短语分词之后 的 position 之间的间隔要满足 slop 的要求。

二、短语前缀匹配:match_phrase_prefix query

这个类似于 match_phrase query,只不过这里多了一个通配符,match_phrase_prefix 支持最后一个词项的前缀匹配,但是由于这种匹配方式效率较低,因此大家作为了解即可。

GET /building_info/_search
{"query": {"match_phrase_prefix": {"name": "金林半岛"}}
}

这个查询过程,会自动进行单词匹配,会自动查找以计开始的单词,默认是 50 个,可以自己控制:

GET /building_info/_search
{"query": {"match_phrase_prefix": {"town_office": {"query": "草堂街道","max_expansions": 3}}}
}

match_phrase_prefix 是针对分片级别的查询,假设 max_expansions 为 1,可能返回多个文档,但是只有一个词,这是我们预期的结果。有的时候实际返回结果和我们预期结果并不一致,原因在于这个查询是分片级别的,不同的分片确实只返回了一个词,但是结果可能来自不同的分片,所以最终会看到多个词。

三、多字段查询:multi_match query

match 查询的升级版,可以指定多个查询域:

GET /building_info/_search
{"query": {"multi_match": {"query": "草堂北路","fields": ["name","town_office", "address"]}}
}

这种查询方式还可以指定字段的权重:

GET /building_info/_search
{"query": {"multi_match": {"query": "草堂北路","fields": ["name^3","town_office^2", "address"]}}
}

这个表示关键字出现在 name 中的权重是出现在 address中权重的 2 倍。

四、Lucene中的简单查询

  • 1、query_string query
    query_string 是一种紧密结合 Lucene 的查询方式,在一个查询语句中可以用到 Lucene 的一些查询语法:
GET building_info/_search
{"query": {"query_string": {"default_field": "name","query": "(草堂) AND (小区)"}}
}
  • 2、simple_query_string
    这个是 query_string 的升级,可以直接使用 +、|、- 代替 AND、OR、NOT 等。
GET building_info/_search
{"query": {"simple_query_string": {"fields": ["name"],"query": "(草堂) + (小区)"}}
}

五、存在查询:exists query

exists query 会返回指定字段中至少有一个非空值的文档:

GET building_info/_search
{"query": {"exists": {"field": "address"}}
}

注意,空字符串也是有值。null 是空值。

六、前缀查询:prefix query

前缀查询,效率略低,除非必要,一般不太建议使用。
给定关键词的前缀去查询:

GET building_info/_search
{"query": {"prefix": {"address": {"value": "成都市成华区"}}}
}

七、通配符查询:wildcard query

wildcard query 即通配符查询。支持单字符和多字符通配符:

  • 1、表示一个任意字符。
  • 2、* 表示零个或者多个字符。
    如下:
# 查询所有成华开头的地址
GET building_info/_search
{"query": {"wildcard": {"county": {"value": "成华*"}}}
}# 查询所有成华开头只有三个字的地址
GET building_info/_search
{"query": {"wildcard": {"county": {"value": "成华?"}}}
}

八、正则表达式查询:regexp query

支持正则表达式查询。
查询所有成华开头并且只有三个字的地址:

GET building_info/_search
{"query": {"regexp": {"county": {"value": "成华."}}}
}

九、错字模糊查询:fuzzy query

在实际搜索中,有时我们可能会打错字,从而导致搜索不到,在 match query 中,可以通过 fuzziness 属性实现模糊查询。

fuzzy query 返回与搜索关键字相似的文档。怎么样就算相似?以LevenShtein 编辑距离为准。编辑距离是指将一个字符变为另一个字符所需要更改字符的次数,更改主要包括四种:

  • 1、更改字符(javb–〉java)
  • 2、删除字符(javva–〉java)
  • 3、插入字符(jaa–〉java)
  • 4、转置字符(ajva–〉java)

为了找到相似的词,模糊查询会在指定的编辑距离中创建搜索关键词的所有可能变化或者扩展的集合,然后进行搜索匹配。

# 正确的应该是:type = 城市住宅
GET building_info/_search
{"query": {"fuzzy": {"type": {"value": "城市住房"}}}
}

总结

仅仅简单记录,可能用到的很少场景下的查询需求。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词