elasticsearch 全文搜索 match_phrase_prefix 查询中的 max_expansions 该怎么用?

发布于 2022-09-11 15:47:22 字数 589 浏览 16 评论 0

首先说明,我使用的是 elasticsearch 6.3 版本,下面来描述问题:

官方文档中说 match_phrase_prefix 查询中有个参数 max_expansions 说的是参数 max_expansions 控制着可以与前缀匹配的词的数量,默认值是 50。

I like swi 查询为例,它会先查找第一个与前缀 swi 匹配的词,然后依次查找搜集与之匹配的词(按字母顺序),直到没有更多可匹配的词或当数量超过 max_expansions 时结束。

但是我在使用时,故意造出了数十个以 swi 开头的词,而将 max_expansions 的值设为 10。但是却返回了所有的结果。如果您知道原因,麻烦告诉我,非常感谢。

GET matchphaseprefixtest/_search
{
  "query": {
    "match_phrase_prefix": {
      "message": {
        "query": "I like sw",
        "max_expansions": 10
       }
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

差↓一点笑了 2022-09-18 15:47:22

你的queryDSL写的是match, 改成match_phrase_prefix


How to Use Fuzzy Searches in Elasticsearch 这篇博客里有这么一段话

It is important to understand that the max_expansions query limit works at the shard level, meaning that even if set to 1, multiple terms may match, all coming from different shards. This behavior can make it seem as if max_expansions is not in effect, so beware that counting unique terms that come are returned is not a valid way to determine if max_expansions is working.

大意是说max_expansions是作用在分片级别(shard level)的,这意味着即使设置为1,依然有可能匹配到多个词,这些词来自不同的分片(shards)。这种行为使得结果看起来跟max_expansions没生效一样,因此谨记计算返回搜索结果的关键词数量不能作为检验max_expansions是否生效的方法

博客讲的是fuzzy query, 但从测试结果看match phrase prefix query中此参数的作用方式也是如此的

验证

通过指定routing从而使结果全部来自一个分片来验证,不过需要注意的是,该分片只有一部分文档,除非索引文档的时候全部指定同一个routing

GET matchphaseprefixtest/_search?routing=1
{
  "query": {
    "match_phrase_prefix": {
      "message": {
        "query": "I like sw",
        "max_expansions": 10
       }
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文