match_phrase
GET /my_index/address/_search
{query: {match_phrase:"hello world"}
}
hello world
必须相邻才能被搜索出来,比如下面的句子:
1.Hello World tom, do you know me // 能搜到
2.see the world // 搜不到
3.Hello tom // 搜不到
match_phrase slop
GET /my_index/address/_search
{query: {match_phrase: {content: "hello world",slop: 2}}
}
可以通过指定slot来控制移动词数。这里中间间隔的词数<2才能搜到。对于下面的例子:
1.hello world // 能搜到
2.hello es world // 能搜索到
3.hello tom es world // 不能搜到
4.hello lity do my world // 搜不到 3>2
match_phrase 原理
match_phrase执行过程:
- 如match搜索一样进行分词
- 对分词后的单词到field中去进行搜索(多个term匹配)。这一步返回每个单词对应的doc,并返回这些单词在对应的doc中的位置
- 对返回的doc进行第一步的筛选,找到每个单词都在同一个field的doc
- 对第3步进行筛选后的doc进行再一次的筛选,选回位置符合要求的doc。比如,对于match_phrase,就是找到后一个单词的位置比前一个单词的位置大1。或者移动次数<slot的文档
- proximity match(使用slot)原理一样,只是第四位对位置进行筛选时的方法不同
比如要搜索“hello world”
- 分词为 hello 和 world
- 分别对term hello和world去搜索。返回两者匹配到的文档。
- 第一次筛选,取两个的交集。
- 继续筛选,对于match_phrase,就是找到后一个单词world的位置比前一个单词hello的位置大1的文档