【问题标题】:Mixing bool and multi match/function score query混合布尔和多匹配/功能分数查询
【发布时间】:2026-02-06 05:35:01
【问题描述】:

我目前正在做一个混合了多重匹配和功能分数的查询。 JSON 的重要部分如下所示:

"function_score":{
    "query":{
        "query_string":{
            "query":"some query",
            "fields":["id","name","strippedDescription","colourSearch","sizeSearch"]
        }
    }
}

但是,我还想包含不一定与查询匹配但具有大于 0 的特定数值的结果。我认为 bool 查询可以做到这一点,但我不知道如何使用 bool使用函数分数查询进行查询。

我知道多重匹配查询只是布尔查询的简写,我可以将多重匹配查询扩展到其布尔对应部分,但是,我不知道如何在其中执行函数得分.

有什么想法吗?顺便说一句,我在 1.1.0 版。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    想通了!我错过了您可以在 bool 查询中嵌套多字段查询的事实!我的最终解决方案如下所示:

    {
        "query":{
            "function_score":{
                "query":{
                    "bool":{
                        "should": [
                           {
                               "range": {
                                  "allBoost": {
                                     "gt": 0
                                  }
                               }
                           },{
                                "multi_match":{
                                    "query":"some search query",
                                    "fields":[
                                        "id",
                                        "name",
                                        "description",
                                        "category"
                                    ]
                                }
                           }
                        ]
                    }
                },
                "functions":[
                    {
                        "filter":{
                            "range": {
                                "allBoost": {
                                    "gt": 0
                                }
                            }
                        },
                        "script_score":{
                            "script":"doc['allBoost'].value"
                        }
                    },
                    {
                        "filter":{
                            "range": {
                                "allBoost": {
                                    "lte": 0
                                }
                            }
                        },
                        "script_score":{
                            "script":"_score"
                        }
                    }
                ],
                "boost_mode": "replace"
            }
        }
    }
    

    【讨论】:

    • 你能告诉我什么时候使用 score_mode 以及在哪里使用 boost_mode 吗??
    • score_mode 指定如何将函数计算的分数减少为单个值,boost_mode 定义如何将单个值与查询的原始分数相结合。