混合bool和多重匹配/功能得分查询

时间:2014-04-03 07:18:16

标签: elasticsearch

我目前正在进行多重匹配和功能评分的混合查询。 JSON的重要部分如下所示:

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

但是,我还希望包含不一定与查询匹配但具有大于0的特定数值的结果。我认为bool查询会执行此操作,但我不知道如何使用bool查询功能得分查询。

据我所知,多重匹配查询只是bool查询的简写,我可以将多重匹配查询扩展到其bool反向部分,但是,我当时不知道如何在其中进行功能评分

有什么想法吗?顺便说一下,我的版本是1.1.0。

1 个答案:

答案 0 :(得分:23)

想出来!我错过了你可以在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"
        }
    }
}