为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2019-01-16 12:58:46
首先说明,我使用的是 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 } } } }
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

你的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
       }
    }
  }
}
查看完整回答
反对 回复 2019-02-12
  • 1 回答
  • 0 关注
  • 1605 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号