首先说明,我使用的是 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
}
}
}
}
你的queryDSL写的是match
, 改成match_phrase_prefix
How to Use Fuzzy Searches in Elasticsearch 这篇博客里有这么一段话
大意是说
max_expansions
是作用在分片级别(shard level)的,这意味着即使设置为1,依然有可能匹配到多个词,这些词来自不同的分片(shards)。这种行为使得结果看起来跟max_expansions
没生效一样,因此谨记计算返回搜索结果的关键词数量不能作为检验max_expansions
是否生效的方法博客讲的是fuzzy query, 但从测试结果看match phrase prefix query中此参数的作用方式也是如此的
验证
通过指定routing从而使结果全部来自一个分片来验证,不过需要注意的是,该分片只有一部分文档,除非索引文档的时候全部指定同一个routing