Elasticsearch 通过几个不同权重的 geo_points 过滤

Posted

技术标签:

【中文标题】Elasticsearch 通过几个不同权重的 geo_points 过滤【英文标题】:Elasticsearch filter by several geo_points with different weights 【发布时间】:2019-05-28 13:03:18 【问题描述】:

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

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

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


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

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

【问题讨论】:

【参考方案1】:

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

您应该在 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
                
            ]
        
    

【讨论】:

以上是关于Elasticsearch 通过几个不同权重的 geo_points 过滤的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch群集搭建介绍,实现高可用

如何通过指定规则改变边缘的权重?

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

将边权重加倍后的最短路径

Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询