html5手机网站免费模板,河北建设集团,最简单的html代码,浙江金顶建设公司网站目录
1.match_phrase使用介绍
2.规避可能产生的查询问题
解决方式
一.查询和索引分词器一致#xff0c;即都使用max_word或者都使用smart
二.使用slop增加匹配的容忍度
3.参考文档 1.match_phrase使用介绍
elasticsearch的match_phrase查询是全文查询#xff0c;主要用…
目录
1.match_phrase使用介绍
2.规避可能产生的查询问题
解决方式
一.查询和索引分词器一致即都使用max_word或者都使用smart
二.使用slop增加匹配的容忍度
3.参考文档 1.match_phrase使用介绍
elasticsearch的match_phrase查询是全文查询主要用于需要的 query 词的顺序与全文匹配中的顺序一致这是基于 lucene 索引中存储的 term 在 doc 中出现的 position 信息来判断的。 match_phrase 首先会把 query 内容分词分词器可以自定义同时文档还要满足以下两个条件才会被搜索到一是分词后所有词项都要出现在指定字段中二是字段中的词项顺序要一致。
查询语法结构为
GET /_search
{query: {match_phrase: {field_name: {query: query string,slop: 2,boost: 10.0,analyzer: my_analyzer}}}
}
参数 field_name指定要匹配的字段名称 query需要查询的 query 文本它属于 field_name 对应的对象里。 slop match_phrase 是精确匹配默认slop 为 0时要求分词后所有词项与 doc 中出现的相对顺序位置一样。使用slop可以将精确匹配的条件放宽slop的意义是需要移动一个 term 多少次才能使得 query 跟 doc 完全匹配主要有两种情况一是缺失某些 term二是 term 一致但是顺序不一致都需要 slop来控制。需要注意的是两个 term 交换位置slop2。 boost加权值 analyzer指定的分词分析器
match_phrase 查询的底层实现是 span queryspan query 一般不常用。 2.规避可能产生的查询问题
正如前文所介绍的那样match_phrase查询的第一步就是分词它的匹配要求所有词都要出现在指定字段并且字段中词项顺序要一致这就为可能出现的查询问题埋下伏笔
一个典型的场景是在文本存储索引时我们使用ik_max_word分词器以希望保存所有可能存在的分词情况原句为“中华人民共和国国歌”会得到
中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌
13个termterm中将包含position位置信息
在查询时改为使用ik_smart分词器输入查询query“中华人民共和国国歌”使用match_phrase查询
会惊奇地发现无法查询到存储原句的文档明明查询query和文档内容一摸一样但为什么match_phrase查不出来
其奥妙就在于切换分词器后两种分词模型的term位置不再对应
ik_smart分词器只会有 中华人民共和国,国歌两个term在这种情况下两个term的位置紧挨在一起而在ik_max_word分词器中同样的term分别在第一个位置和第13个位置间隔非常远
因此
GET test_index/_search
{query: {match_phrase: {message: 中华人民共和国国歌,analyzer:ik_smart}}
}
查询语句match_phrase会认为两种分词模型下的term并不匹配从而无法查出结果
解决方式
解决方法有两种
一.查询和索引分词器一致即都使用max_word或者都使用smart
GET test_index/_search
{query: {match_phrase: {message: 中华人民共和国国歌,analyzer:ik_max_word}}
}
或者不指定会默认使用索引该字段的分词器
GET test_index/_search
{query: {match_phrase: {message: 中华人民共和国国歌}}
}
都能解决问题
二.使用slop增加匹配的容忍度
slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。我们可以理解为slop参数越大代表match_phrase查询中对分词term之间间隔距离的容忍度越大
在不设置slop参数时它默认为0即最严格的匹配term与term之间不允许有任何的间隔必须紧挨在一起
在举例的场景中因为索引的term 中华人民共和国 、国歌位于第1和第13位置将slop设置为12也能解决查询不到的问题
GET test_index/_search
{query: {match_phrase: {message: 中华人民共和国国歌,analyzer:ik_smart,slop:12}}
}
3.参考文档
[Match phrase query | Elasticsearch Guide [8.15] | Elastic] https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html
[GitHub - infinilabs/analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into Elasticsearch and OpenSearch, support customized dictionary.] https://github.com/infinilabs/analysis-ik