Elasticsearch中实现电影标题与集数关联搜索并过滤无关结果
解决方案
要实现「仅当title_fa字段匹配时才累加title_fa.title_fa的得分」,核心是先确保核心字段title_fa匹配(过滤掉不含"it"的文档),再在这个基础上对子字段的匹配额外加分,具体修改如下:
调整后的查询语句
query = { "from": 0, "size": 300, "query": { "function_score": { # 主查询:必须匹配title_fa字段,确保文档含核心关键词(如"it") "query": { "bool": { "must": [ { "multi_match": { "query": keyword, "fields": ["title_fa"] } } ], # 可选匹配子字段,仅当主字段匹配时才参与得分计算 "should": [ { "multi_match": { "query": keyword, "fields": ["title_fa.title_fa"] } } ], "adjust_pure_negative": True, "minimum_should_match": 0 } }, "functions": [ # 对title_fa匹配的文档额外加权重分 { "weight": 2, "filter": { "multi_match": { "query": keyword, "fields": ["title_fa"] } } }, # 仅当title_fa.title_fa也匹配时,再加额外权重分(依赖主字段已匹配) { "weight": 1, "filter": { "multi_match": { "query": keyword, "fields": ["title_fa.title_fa"] } } } ] } } }
关键修改说明
- 主查询改用bool must:强制要求
title_fa字段匹配关键词,直接排除像《Annabelle episode 2》这类不含核心词(如"it")的文档,从根源解决无关结果的问题。 - should子句加入子字段匹配:仅当主字段
title_fa匹配时,子字段title_fa.title_fa的匹配才会贡献基础得分(比如匹配"episode 2"时提升排序优先级)。 - 保留原function_score的权重逻辑:在基础得分之上,对主字段匹配加2倍权重,子字段匹配加1倍权重,进一步强化核心匹配文档的排序优先级。
补充验证逻辑
由于你的mapping中title_fa字段已过滤掉"episode""2"这类停用词,所以当搜索"it episode 2"时:
- 《It episode 2》的
title_fa字段会匹配"it",满足must条件;title_fa.title_fa字段匹配"episode 2",获得额外得分,排序靠前。 - 《Annabelle episode 2》的
title_fa字段仅包含"annabelle",无法匹配"it",直接被must过滤,不会出现在结果中。
内容的提问来源于stack exchange,提问作者Farnaz Maleki
相关产品推荐
相关产品推荐

