Elasticsearch multi_match查询出现无关结果如何正确配置
问题根因
- 当前配置的
operator参数值为or,搭配cross_fields查询逻辑时,没有强制要求查询词必须完整命中,和查询词字形相近的词(比如和Booking仅首字母不同的Cooking)会被判定为匹配项召回。 - 配置未关闭模糊匹配、未设置全词项命中约束,导致低相关的形近词结果提前返回,大量包含精确词的有效结果反而被挤到召回队列后面,没有被正常返回。
适配需求的查询配置
直接调整原有multi_match配置即可,单/多词查询场景不需要额外做逻辑判断,调整后的代码如下:
$this->aQuery['query']['bool']['must'][]['multi_match'] = [ 'type' => 'cross_fields', 'query' => $userInput, // 直接传入用户输入的搜索关键词即可 'fields' => ['prod_name', 'prod_prefix'], 'operator' => 'and', 'fuzziness' => 0, 'minimum_should_match' => '100%' ];
配置效果说明
- 输入单个词
Booking时,fuzziness:0会完全关闭形近词模糊匹配,operator:and强制要求结果必须包含完整的Booking词项,Cooking这类无关内容不会被召回。 - 输入
Travel Booking这类多词内容时,查询词会被分词器拆分为独立词项,operator:and+minimum_should_match:100%会要求所有拆分后的词项都必须在指定字段中命中,才会返回对应结果,符合多词查询的匹配要求。 - 如果需要优化精确匹配结果的排序,可以在配置中新增
'tie_breaker' => 0.3参数,提升同时在多个字段命中查询词的结果权重,让相关度更高的结果排在更靠前的位置。
内容的提问来源于stack exchange,提问作者Артур Саленко
相关产品推荐
相关产品推荐

