elasticsearch点滤波

b0zn9rqh  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(377)

我有一些文档,除了其他字段外,还有一些 geo_point 与他们有联系。我要查找与特定城市相关的所有文档。为此,我还有一个城市索引,我首先搜索它,得到一个坐标列表 _score 这是搜索的结果。现在我想把这些数据传递给文档搜索,并用找到的文档的得分乘以相应的城市得分。
假设第一个查询返回一个元组列表 [(city_coords, city_score), (...)] ,我想使用 function_score 以及 functions 将每个城市作为一个单独的函数与其单独的分数进行数组。
但是,当我以最简单的形式构造查询时,它会获取索引中的所有文档。以下是我提出的问题:

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

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

5gfr0r5j

5gfr0r5j1#

因为您没有在 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
                }
            ]
        }
    }
}

相关问题