You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:25:30