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

ReyCG
  • 188

首先说明,我使用的是 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
       }
    }
  }
}
回复
阅读 7.4k
1 个回答
waterDoge
  • 1.3k
✓ 已被采纳

你的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
       }
    }
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏