带有过滤器的ElasticSearch function_score查询

时间:2015-02-07 17:10:52

标签: elasticsearch

尝试创建一个搜索,该搜索会返回距离某个地理位置约500米的位置结果。

我需要根据源中的位置是否为空来过滤此搜索的结果。

我尝试过这样的事情:

"filtered" : {
    "filter": {
        "missing" : { "field" : "location" }
    }
}

这是我获得的搜索JSON:

 {"query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {"fieldA": "value"}
                        },
                        {
                            "match": { "fieldB": "value"}
                        }
                    ]
                }
            },
            "functions": [{
                    "gauss": {
                        "location": {
                            "origin": "'.$lat.','.$lon.'",
                            "scale": "500m",
                            "offset": "0km",
                            "decay": 0.33
                        }
                    }
                }]
        }
    }
}

我尝试将过滤器放在查询的不同位置,但它对我不起作用,所以我知道我正在做一些根本错误的查询结构。将来我想添加更多评分逻辑和其他过滤器,但找不到这样的查询的好例子。

我应该做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:17)

您可以使用带有geo_distance的过滤查询来首先过滤掉结果。您还可以在function_score中使用“weight”来显式提升“匹配”查询的距离:

{
   "query": {
      "function_score": {
         "query": {
            "filtered": {
               "query": {
                  "bool": {
                     "must": [
                        {
                           "match": {
                              "fieldA": "value"
                           }
                        },
                        {
                           "match": {
                              "fieldB": "value"
                           }
                        }
                     ]
                  }
               },
               "filter": {
                  "geo_distance" : {
                        "distance" : "500m",
                        "location" : "'.$lat.','.$lon.'"
                    }
               }
            }
         },
         "functions": [
            {
               "gauss": {
                  "location": {
                     "origin": "'.$lat.','.$lon.'",
                     "scale": "500m",
                     "offset": "0km",
                     "decay": 0.33
                  }
               },
               "weight": "3"
            }
         ]
      }
   }
}