Elasticsearch - 短语匹配(match_phrase)以及slop参数
2018-02-08 16:03
519 查看
短语匹配(Phrase Matching)
就像用于全文搜索的的match查询一样,当你希望寻找邻近的单词时,match_phrase查询可以帮你达到目的。GET /my_index/my_type/_search { "query": { "match_phrase": { "title": "quick brown fox" } } }和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接。一个针对短语quick fox的查询不会匹配我们的任何文档,因为没有文档含有邻接在一起的quick和fox词条。
match_phrase查询也可以写成类型为phrase的match查询:
"match": { "title": { "query": "quick brown fox", "type": "phrase" } }
词条位置
当一个字符串被分析时,分析器不仅只返回一个词条列表,它同时也返回原始字符串的每个词条的位置、或者顺序信息:
GET /_analyze?analyzer=standard Quick brown fox返回如下:
{ "tokens": [ { "token": "quick", "start_offset": 0, "end_offset": 5, "type": "<ALPHANUM>", "position": 1 }, { "token": "brown", "start_offset": 6, "end_offset": 11, "type": "<ALPHANUM>", "position": 2 }, { "token": "fox", "start_offset": 12, "end_offset": 15, "type": "<ALPHANUM>", "position": 3 } ] }
表示原始字符串各个词条的位置. |
短语是什么
对于匹配了短语"quick brown fox"的文档,下面的条件必须为true:quick、brown和fox必须全部出现在某个字段中。brown的位置必须比quick的位置大1。
fox的位置必须比quick的位置大2。
如果以上的任何一个条件没有被满足,那么文档就不能被匹配。
在内部,match_phrase查询使用了低级的span查询族(Query Family)来执行位置感知的查询。span查询是词条级别的查询,因此它们没有解析阶段(Analysis Phase);它们直接搜索精确的词条。幸运的是,大多数用户几乎不需要直接使用span查询,因为match_phrase查询通常已经够好了。但是,对于某些特别的字段,比如专利搜索(Patent Search),会使用这些低级查询来执行拥有非常特别构造的位置搜索。
以上参考:https://www.elastic.co/guide/en/elasticsearch/guide/current/phrase-matching.html#phrase-matching
混合起来(Mixing it up)
精确短语(Exact-phrase)匹配也许太过于严格了。也许我们希望含有"quick brown fox"的文档也能够匹配"quick fox"查询,即使位置并不是完全相等的。我们可以在短语匹配使用slop参数来引入一些灵活性:GET /my_index/my_type/_search { "query": { "match_phrase": { "title": { "query": "quick fox", "slop": 1 } } } }slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配?我们以一个简单的例子来阐述这个概念。为了让查询quick fox能够匹配含有quick brown fox的文档,我们需要slop的值为1:
Pos 1 Pos 2 Pos 3 ----------------------------------------------- Doc: quick brown fox ----------------------------------------------- Query: quick fox Slop 1: quick ↳ fox尽管在使用了slop的短语匹配中,所有的单词都需要出现,但是单词的出现顺序可以不同。如果slop的值足够大,那么单词的顺序可以是任意的。为了让fox quick查询能够匹配我们的文档,需要slop的值为3:
Pos 1 Pos 2 Pos 3 ----------------------------------------------- Doc: quick brown fox ----------------------------------------------- Query: fox quick Slop 1: fox|quick ↵ Slop 2: quick ↳ fox Slop 3: quick ↳ fox以上参考:https://www.elastic.co/guide/en/elasticsearch/guide/current/slop.html
相关文章推荐
- Elasticsearch - 短语匹配(match_phrase)以及slop参数
- Elasticsearch - 短语匹配(match_phrase)以及slop参数
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop参数
- [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数
- 18_ElasticSearch 基于slop参数实现近似匹配
- elasticsearch 短语查询(match_phrase)
- 【Elasticsearch】搜索小记之 match VS match_phrase
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- ElasticSearch47:初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方法
- PHP 正则preg_match 与 preg_match_all 函数以及匹配中文
- 19_ElasticSearch 使用match和近似匹配实现召回率与精准度的平衡
- [Elasticsearch] 邻近匹配 (三) - 性能,关联单词查询以及Shingles
- ElasticSearch查询 第四篇:匹配查询(Match)
- [ElasticSearch]Term精确匹配中文字符串短语
- [ElasticSearch]Term精确匹配中文字符串短语
- php 正则表达式匹配(输出是否匹配以及匹配值) preg_match
- 22_ElasticSearch 搜索推荐match_phrase_prefix实现search-time
- Elasticsearch实战 | match_phrase搜不出来,怎么办?