ES全文检索-match phrase query

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 query


原文始发于微信公众号(一只菜鸟程序员):ES全文检索-match phrase query

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72814.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!