match phrase query
属于全文搜索,它首先会对查询文本进行分词,然后创建短语查询。对于匹配的文档,它要求文档必须含有所有分词结果的词,顺序还需要保持一致,而且默认情况下必须是连续的。
POST _bulk
{ "index" : { "_index" : "test_doc4"} }
{ "content":"I like apple"}
{ "index" : { "_index" : "test_doc4"} }
{ "content":"I like red apple"}
上面是构建的测试数据,下面直接执行如下搜索:
GET test_doc4/_search
{
"query": {
"match_phrase": {
"content": {
"query": "i like apple"
}
}
}
}
运行结果如下:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.58091426,
"hits" : [
{
"_index" : "test_doc4",
"_type" : "_doc",
"_id" : "luAqzIQBRNx5Pfd5RgSH",
"_score" : 0.58091426,
"_source" : {
"content" : "I like apple"
}
}
]
}
}
最后的结果中只有文档1返回,那么为什么文档2没有返回呢?虽然文档2含有所有分词后的结果,并且他们的顺序也是一致的,但是它们并不是连续的。因为文档2多了一个red
,这导致apple
的位置与搜索条件中的位置不一致,所以文档2无法被匹配到。
slop
针对上面的问题,我们可以通过slop参数来解决。该参数用来告诉match phrase query
查询相隔多远时仍然能够将文档视为匹配。
GET test_doc4/_search
{
"query": {
"match_phrase": {
"content": {
"query": "i like apple",
"slop": 1
}
}
}
}
在上面查询中,我们设置了slop
为1。对于文档2,我们只需要调整一次即可使其匹配上查询条件。
analyzer
该参数用法与match query
中一致。
zero_terms_query
该参数用法与match query
中一致。
对比
对比match query
而言,match phrase query
显得更加严格,它们之间的区别如下:
-
match query
默认情况下分词后的搜索文本只要有一个词匹配即可,而match phrase query
要求全部匹配。 -
match query
对词之间的顺序没有要求,而match phrase query
要求词的顺序与查询文本分词保持一致,且默认情况下是连续的(可以通过slop进行宽松化处理)。
它们的相同之处是搜索文本都需要先经过分析器进行分词处理,都属于全文搜索。
原文始发于微信公众号(一只菜鸟程序员):ES全文检索-match phrase query
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72814.html