Bool查询中带有应用子句的弹性搜索功能评分查询

时间:2018-03-07 19:36:06

标签: elasticsearch

这是一个有2个查询的故事。一个返回结果,而另一个不返回。为什么呢?

返回结果的查询:

{
   "index":"my_index",
   "type":"places",
   "body":{
      "from":0,
      "size":"12",
      "sort":{
         "_score":{
            "order":"desc"
         }
      },
      "query":{
         "function_score":{
            "query":{
               "bool":{
                  "must":[

                  ],
                  "should":[

                  ],
                  "must_not":[

                  ],
                  "filter":[

                  ]
               }
            },
            "functions":[
               {
                  "gauss":{
                     "location":{
                        "origin":{
                           "lat":"41.243368",
                           "lon":"-116.79711"
                        },
                        "offset":"0mi",
                        "scale":"100mi"
                     }
                  }
               }
            ],
            "score_mode":"sum",
            "boost_mode":"sum"
         }
      }
   }
}

不返回结果的查询:

{
   "index":"my_index",
   "type":"places",
   "body":{
      "from":0,
      "size":"12",
      "sort":{
         "_score":{
            "order":"desc"
         }
      },
      "query":{
         "function_score":{
            "query":{
               "bool":{
                  "must":[

                  ],
                  "should":[
                     {
                        "terms":{
                           "region_id":[
                              32273
                           ],
                           "boost":2
                        }
                     }
                  ],
                  "must_not":[

                  ],
                  "filter":[

                  ]
               }
            },
            "functions":[
               {
                  "gauss":{
                     "location":{
                        "origin":{
                           "lat":"41.243368",
                           "lon":"-116.79711"
                        },
                        "offset":"0mi",
                        "scale":"100mi"
                     }
                  }
               }
            ],
            "score_mode":"sum",
            "boost_mode":"sum"
         }
      }
   }
}

Bool查询只有一个应用条款。

另外,我总结得分,而不是将它们相乘。

确实,我在索引中没有任何具有指定“region_id”的项目,但是我无法看到第一个查询的结果是如何从第二个查询中排除的。似乎Bool Query上的0分表示过滤器。

1 个答案:

答案 0 :(得分:2)

第一个查询充当should查询,因此它返回所有内容并应用函数分数。 在第二个查询中,您有must子句,但由于没有filterdiff子句,因此必须匹配。

来自ES docs:“在没有must或filter子句的布尔查询中,一个或多个should子句必须与文档匹配”