当前位置: 首页 > 面试题库 >

在数组中具有多个位置的ElasticSearch地理距离过滤器-可能吗?

夹谷岳
2023-03-14
问题内容

假设我们在ElasticSearch索引中有一堆文档。每个文档 在一个数组中 都有多个位置,如下所示:

{
  "name": "foobar",
  "locations": [
    {
      "lat": 40.708519,
      "lon": -74.003212
    },
    {
      "lat": 39.752609,
      "lon": -104.998100
    },
    {
      "lat": 51.506321,
      "lon": -0.127140
    }
  ]
}

根据ElasticSearch参考指南

geo_distance过滤器可以针对每个文档使用多个位置/点。一旦单个位置/点与过滤器匹配,则文档将包含在过滤器中。

因此,是否可以创建检查数组中所有位置的地理距离过滤器?

不幸的是,这似乎不起作用:

{
  "filter": {
    "geo_distance": {
      "distance": "100 km",
      "locations": "40, -105"
    }
  }
}

抛出“ QueryParsingException[[myIndex] failed to find geo_point field [locations]”,因为locations它不是单个值,geo_point而是geo_points 的数组。


问题答案:

您是否为文档指定了geo_point映射?

curl -XDELETE 'http://localhost:9200/twitter/'
curl -XPUT 'http://localhost:9200/twitter/'

curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '
{
    "tweet" : {
        "properties" : {
            "locations" : {"type" : "geo_point"}
        }
    }
}'

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elastic Search, so far so good?",
    "locations" : [{
        "lat" : 50.00,
        "lon" : 10.00
    },
    {
        "lat" : 40.00,
        "lon" : 9.00
    }]
}'

curl -XPUT 'http://localhost:9200/twitter/tweet/2' -d '
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elastic Search, so far so good?",
    "locations" : [{
        "lat" : 30.00,
        "lon" : 8.00
    },
    {
        "lat" : 20.00,
        "lon" : 7.00
    }]
}'

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query": {
        "filtered" : {
            "query" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "20km",
                    "tweet.locations" : {
                        "lat" : 40.00,
                        "lon" : 9.00
                    }
                }
            }
        }
    }
}'


 类似资料:
  • 问题内容: 我在查询中使用带轮胎的过滤器,效果很好: 我希望结果将以某种方式包括我用于过滤器的地理位置的计算距离。 有没有办法告诉Elasticsearch在响应中包括它,这样我就不必为每个结果都用ruby计算它? ==更新== 我在一个Google网上论坛中找到了答案: 按排序将得出原始结果中的距离。 问题答案: 排序依据将返回结果中的距离:http : //www.elasticsearch.

  • 问题内容: 我在Django区域和商店中有2个模型,模型是这样的: LocationField是一个PointField,在django admin中具有更好的地图。 我希望在每个商店中根据商店位置,区域位置和半径自动选择区域。如果没有半径可支持车间的区域,则将为“无”。我试过这个查询: 但是我得到这个错误: TypeError:float()参数必须是字符串或数字,而不是’F’ 我怎样才能解决这

  • 因此,我的文档(帖子)中有一个位置字段。此位置字段是一个地理形状。它可以是一个点或多边形。有时,我可能不得不使用地理距离过滤器来获取标记最接近某个坐标的帖子(仅具有键入地理形状,而不是多边形)。然而,在尝试使用geo_距离过滤器时,我遇到了以下错误。 是否有一种方法可以在类型的地理图形上使用地理距离过滤器?

  • 我想要一个Elasticsearch索引,它只存储功能的“名称”。我希望能够发出语音查询,也可以单独键入前置式查询。我想我可以用两个分析器和两个过滤器创建一个索引;每个分析仪可以使用其中一个过滤器。但我似乎无法做到这一点。 以下是我尝试使用的索引设置json: 当我尝试使用这些设置创建索引时: 我得到一个HTTP 400,说 别误会,我完全明白这句话的意思。我看了又看,寻找一个错误的逗号或引号,但

  • 我有http://www.codereye.com/2010/10/how-to-calculate-distance-between-2.html的这段代码,它根据两个IP地址对应的纬度和经度计算它们之间的大致物理距离。 lat和long是有符号值。但是,此代码有时会将dist返回为NaN。 我错过什么了吗?θ需要是绝对值吗? 更新:返回南的测试值:- lat1=-23.5477,lon1=-4

  • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问