Elasticsearch 地理空间查询不返回任何命中

Posted

技术标签:

【中文标题】Elasticsearch 地理空间查询不返回任何命中【英文标题】:Elasticsearch geospatial queries returning no hits 【发布时间】:2018-06-22 14:00:38 【问题描述】:

我正在使用 Kibana 在 Elasticsearch 中查看地理空间数据集,以了解当前正在开发的功能。有一个包含字段“loc.coordinates”的位置索引,它是一个geo_point,并且具有这样的数据:

loc.coordinates         25.906958000000003, 51.776407000000006

但是,当我运行以下查询时,我没有得到任何结果:

查询

GET /positions/_search

    "query": 
        "bool" : 
            "must" : 
                "match_all" : 
            ,
            "filter" : 
                "geo_distance" : 
                    "distance" : "2000km",
                    "loc.coordinates" : 
                        "lat" : 25,
                        "lon" : 51
                    
                
            
        
    

回应


  "took": 12,
  "timed_out": false,
  "_shards": 
    "total": 6,
    "successful": 6,
    "skipped": 0,
    "failed": 0
  ,
  "hits": 
    "total": 0,
    "max_score": null,
    "hits": []
  

我试图理解为什么会这样,因为索引中有超过 250,000 个数据点,而且无论搜索区域有多大,我都没有得到任何点击。当我查看位置索引映射时,我看到以下内容:

"loc": 
  "type": "nested",
  "properties": 
    "coordinates": 
      "type": "geo_point"
    ,
    "type": 
      "type": "text",
      "fields": 
        "keyword": 
          "type": "keyword",
          "ignore_above": 256
        
      
    
  
,

我是 Elasticsearch 的新手,一直在阅读文档,但到目前为止,我不明白为什么我的地理查询没有按预期工作。我做错了什么?

【问题讨论】:

【参考方案1】:

您的loc 字段属于nested 类型,因此您需要使用nested 查询相应地查询该字段:

GET /positions/_search

    "query": 
        "bool" : 
            "filter" : 
                "nested": 
                   "path": "loc",
                   "query": 
                      "geo_distance" : 
                         "distance" : "2000km",
                         "loc.coordinates" : 
                            "lat" : 25,
                            "lon" : 51
                         
                      
                   
                
            
        
    

【讨论】:

啊,这就解释了!嵌套它有什么明显的优势吗?查看其余的映射,似乎没有必要。此外,当我在vessel_position 索引上对loc.coordinates 进行桶聚合时,Visualize > Map 可视化中目前没有显示任何内容,这一定是原因。 如果您有一个对象,则不需要嵌套(仅当您有一个对象数组时)。另请注意,嵌套数据类型无法在 KIbana 中查询。

以上是关于Elasticsearch 地理空间查询不返回任何命中的主要内容,如果未能解决你的问题,请参考以下文章

返回地理点数组的 Elasticsearch 距离

如何进行地理距离查询仅返回我尚未“喜欢”的结果、Elastic Search、Dynamo DB

Mongoosejs:将 query.or() 与地理空间查询一起使用

MongoDB 对地理空间查询的计数不准确

对映射的DynamoDb数据进行Elasticsearch嵌套查询不返回任何内容

elasticsearch地理距离过滤器,但距离在文档上而不是在查询中