Elasticsearch 过滤几个 geo_points 不同的权重

Elasticsearch filter by several geo_points with different weights

我有许多文档,除了其他字段外,还有许多 geo_point 与之关联。我想查找与特定城市关联的所有文档。为此,我还有一个城市索引,我首先搜索它并从该搜索中获取带有 _score 的坐标列表。现在我想将该数据传递给文档搜索,并将找到的文档的分数乘以相应的城市分数。

假设第一个查询 returns 是一个像 [(city_coords, city_score), (...)] 这样的元组列表,我想使用 function_scorefunctions 数组构建对文档索引的查询每个城市作为一个单独的功能,具有单独的分数。

但是,当我以最简单的形式构造查询时,它会获取索引中的所有文档。这是我所做的查询:

{
    'query': {
        'function_score': {
            'functions': [
                {
                    "filter": {
                        "geo_distance": {
                            "distance": "1km",
                            "distance_type": "plane",
                            "points": city_coords
                        },
                    },
                    'weight': city_score
                }
            ]
        }
    }
}

我错过了什么吗?如何只获取与该特定城市关联的文档?

由于您没有在 function_score 部分指定查询,因此 Elastic 假设一个 match_all 查询。因此它 returns 所有文档并为所选查询附近的文档添加一个提升。

您应该在 function_score 部分添加一个特定的查询,以过滤掉距离所选城市不够近的任何文档。像

{
    "query": {
        "function_score": {
            "query": {
              "bool": {
                "should": [
                  {
                    "geo_distance": {
                        "distance": "1km",
                        "distance_type": "plane",
                        "points": city_coords1
                    }
                  },
                  {
                    "geo_distance": {
                        "distance": "1km",
                        "distance_type": "plane",
                        "points": city_coords2
                    }
                  },
                  ... and so on
                ]
              }
            },
            "functions": [
                {
                    "filter": {
                        "geo_distance": {
                            "distance": "1km",
                            "distance_type": "plane",
                            "points": city_coords
                        },
                    },
                    "weight": city_score
                }
            ]
        }
    }
}