在dis_max中组合两个function_score查询

时间:2017-01-05 13:37:40

标签: elasticsearch

我想用两个子查询进行查询,每个子查询都有自己的基于带脚本的function_score的评分。例如,这个子查询:

sudo

工作正常,其得分基于价格(约190分)。但是如果我尝试在dis_max查询中组合两个子查询,则function_score不起作用,我得到的分数大约为1分。

每个子查询的说明如下所示

 {
   "query":{
      "function_score":{
         "query":{
            "bool":{
               "filter":[
                  {
                     "term":{
                        "rooms_count":3
                     }
                  },
                  {
                     "term":{
                        "addresses":"d76255c8-3173-4db5-a39b-badd3ebdf851"
                     }
                  },
                  {
                     "exists":{
                        "field":"zhk_id"
                     }
                  }
               ]
            }
         },
         "script_score":{
            "script":"1 * doc['price'].value/100000"
         },
         "boost_mode":"replace"
      }
   }
    }

用于dis_max查询,如

    "value": 100.9416, "description": "script score function, computed with script:"[script: 1 * doc['price'].value/100000, type: inline, lang: null, params: {}]" and parameters:
{}",

有人能告诉我,如何正确组合function_score查询?

我的完整dis_max查询on pastebin

1 个答案:

答案 0 :(得分:0)

感谢https://discuss.elastic.co/t/combine-two-function-score-queries-in-dis-max/70666的Daniel Mitterdorfer。

正确的查询是

 {
   "query":{
      "dis_max":{
         "queries":[
        {
                        "function_score":{
                           "query":{
                              "bool":{
                                 "filter":[
                                    {
                                       "term":{
                                          "rooms_count":3
                                       }
                                    },
                                    {
                                       "term":{
                                          "addresses":"d76255c8-3173-4db5-a39b-badd3ebdf851"
                                       }
                                    },
                                    {
                                       "missing":{
                                          "field":"zhk_id"
                                       }
                                    }
                                 ]
                              }
                           },
                           "script_score":{
                              "script":"1 * doc['price'].value/100000"
                           },
                           "boost_mode":"replace"
                        }
                  },
        {
                        "function_score":{
                           "query":{
                              "bool":{
                                 "filter":[
                                    {
                                       "term":{
                                          "rooms_count":3
                                       }
                                    },
                                    {
                                       "term":{
                                          "addresses":"d76255c8-3173-4db5-a39b-badd3ebdf851"
                                       }
                                    },
                                    {
                                       "exists":{
                                          "field":"zhk_id"
                                       }
                                    }
                                 ]
                              }
                           },
                           "script_score":{
                              "script":"1 * doc['price'].value/100000"
                           },
                           "boost_mode":"replace"
                        }
                     }
         ]
      }
   }
}