目录

ES核心相似度匹配逻辑:

分词器选择:

IK 分词器

分词器使用演示:

ik分词器最佳实践:

使用minimum_should_match

正向匹配度-使用个数

正向匹配度-使用百分比

逆向匹配

组合匹配(Combination)


ES核心相似度匹配逻辑:

ES的核心相似度匹配逻辑,或者匹配目的,可以不是很严谨的用以下两句话承载。

  1. 局部常见:该单词在文档中多次出现
  2. 全局罕见:该单词在语料库中出现的次数并不多。

详见:Elasticsearch中的相似度评分机制_chenxy02的博客-CSDN博客_elasticsearch 相似度

分词器选择:

ES相似度匹配的结果与所选择的分词器类别息息相关,常见的分词器如下:

  • Standard:单字切分法,一个字(对于英文为一个单词)切分成一个词,ES默认内置分词器。
  • CJKAnalyzer: 二元切分法, 把相邻的两个字, 作为一个词。
  • SmartChineseAnalyzer: 对中文支持较好, 但是扩展性差, 针对扩展词库、停用词均不好处理。
  • Whitespace分词器:去除空格,不支持中文,对生成的词汇单元不进行其他标准化处理。
  • language分词器:特定语言的分词器,不支持中文。
  • IK-analyzer: 在做中文搜索时,最受欢迎的分词器,支持自定义词库。

IK 分词器

IK分词器有两种分词模式:ik_max_word和ik_smart模式。

1、ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。

2、ik_smart

会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

分词器使用演示:

使用es内置standard分词算法:

使用ik_max_word分词算法:

使用ik_smart分词算法:

ik分词器最佳实践:

关于做中文检索时,使用分词器的最佳实践业界有两种说法:

1、索引时用ik_max_word,在搜索时用ik_smart。即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。

2、创建mapping时指定分词器和查询事指定的分词器,保持一致。

使用minimum_should_match

这一部分我们使用的实验数据为:

POST similarity-score/_doc/_bulk
{"index":{}}
{"text":"what is your birthday"}
{"index":{}}
{"text":"nothing is impossible"}
{"index":{}}
{"text":"Blue sky"}
{"index":{}}
{"text":"good morning"}

ElasticSearch query中的minimum_should_match,最小匹配度。它有很多种配置方式。

正向匹配度-使用个数

比如 "minimum_should_match":3 官方原文解释是:Indicates a fixed value regardless of the number of optional clauses。

这里要说明一下为什么是optional clauses(翻译为可选的子句),因为对于被analyzer分解出来的每一个term都会构造成一个should的bool query的查询,每个term变成一个term query子句。

比如 "query": "what is your",会被解析成:

{ 
  "bool": { 
    "should": [ 
      { "term": { "body": "what"}}, 
      { "term": { "body": "is"}}, 
      { "term": { "body": "your"}}
    ], 
    "minimum_should_match": 3 
  } 
} 

不使用  "minimum_should_match"的情况:

使用 "minimum_should_match:2"的情况:

正向匹配度-使用百分比

比如"minimum_should_match":75%,可以配置一个一个百分比,至少optional clauses至少满足75%,这里是向下取整的。 
比如有5个clause,5*75%=3.75,向下取整为3,也就是至少需要match 3个clause。 

注意:由于是向下取整,所以尤其针对短的query,我们把"minimum_should_match"设为大于100% 还是可以得到结果(如下,130*3=3.90,向下取整为3)

逆向匹配

逆向匹配和正向匹配相反,比如我们可以近似理解为-25%和75%表示的是一个意思,但是有些小小的差异,比如有5个clause,逆向匹配-25%,5*25%=1.25,取整是1,5-1=4,即要匹配4个clause,而75%算出来是3个clause。 

组合匹配(Combination)

比如,"minimum_should_match": 3<90%,官方的解释有点搞,感觉描述的有点复杂。描述如下: 

A positive integer, followed by the less-than symbol, followed by any of the previously mentioned specifiers is a conditional specification. It indicates that if the number of optional clauses is equal to (or less than) the integer, they are all required, but if it’s greater than the integer, the specification applies. In this example: if there are 1 to 3 clauses they are all required, but for 4 or more clauses only 90% are required. 
意思是说如果1<clauses<=3,那么两个条件都要满足( they are all required),如果clauses>3,那么只要满足90%这个条件。


以以上实验为例,当1<clauses<=3,"what"、"is"、"your"都是必需的。

---------------------------------------------------------------------------------------------

参考网址:

Elasticsearch中的相似度评分介绍 - 云+社区 - 腾讯云

Elasticsearch搜索中文分词优化-ik_max_word,和ik_smart模式_yinni11的博客-CSDN博客

ElasticSearch之mapping分词器选择_numbbe的博客-CSDN博客

elasticsearch中minimum_should_match的一些理解_xiao_jun_0820的专栏-CSDN博客

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐