python - ElasticSearch地理距离查询

标签 python elasticsearch pyes

我正在像这样在Python中使用地理距离查询

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "20miles",
          "location": {
            "lat": 51.512497,
            "lon": -0.052098
          }
        }
      }
    }
  }
} 

它工作正常。我的问题是如何在文档中赋予“距离”一个值。我的每条记录的索引中有一个类似 distance: 50 的字段,我想将其用作地理距离中的距离值。我尝试了 "distance":doc['distance'].value 但它不起作用。

最佳答案

普通查询和过滤器不希望在其中放置脚本。

假设您已存储字段名称为 locationgeo_point,那么您希望使用 script filter 来使用 doc['field_name'].distanceInMiles(lat, lon)(而不是 distance(纬度、经度),因为标准单位是 (截至 v1.0.0):

{
  "filtered" : {
    "query" : { "match_all" : { } },
    "filter" : {
      "script" : {
        "script" :
          "doc['location'].distanceInMiles(lat, lon) < doc['distance'].value",
        "params" : {
          "lat" : 51.512497,
          "lon" : -0.052098
        }
      }
    }
  }
}

如果您运行的 Elasticsearch 实例使用之前的标准单位英里(v1.0.0 之前的版本),那么你可以使用简单的 distance 函数(或者如果你的 distance 单位已经恰好是现在标准的 meters v1.0.0 ):

{
  "filtered" : {
    "query" : { "match_all" : { } },
    "filter" : {
      "script" : {
        "script" :
          "doc['location'].distance(lat, lon) < doc['distance'].value",
        "params" : {
          "lat" : 51.512497,
          "lon" : -0.052098
        }
      }
    }
  }
}

注意:您可以直接在脚本中提供latlon 值以进行一次性执行,但脚本会被编译已缓存,因此使用参数可以重复使用,从而在首次使用后执行速度更快。

正如文档中所述,您可以通过在过滤器中添加 "_cache": true 来缓存过滤器的结果,但过滤器的结果不是默认缓存。

关于python - ElasticSearch地理距离查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031226/

相关文章:

python - 查询 DSL 在 pyes 搜索中不起作用

python - Elasticsearch python API : Delete documents by query

python - 如何使用 tkinter filedialog.askopenfilename 方法避免文件选择器中的隐藏文件?

python 基于左括号和右括号的逗号分隔字符串的目录结构显示

python - Pandas:在映射操作之前设置具有重复值的列的索引

elasticsearch - 禁用分配的单个副本的意外ElasticSearch分片分配

elasticsearch - Elasticsearch查询大于日期

ruby-on-rails - 连接被拒绝 - 连接(2) "localhost"端口 9200 与 DigitalOcean

python - 相互引用类的类型检查

python - 通过 elasticutils 过滤的 ElasticSearch