如何从ElasticSearch中仅获取多个类别的第一个文档

时间:2018-03-01 23:22:17

标签: elasticsearch

我正在索引一个如下所示的文档:

{
  "driverId": 1234,
  "category": "SIMPLE",
  "location": {
    "lat": -40,
    "lon": 10        
  }
}

我在这个索引中有3个不同的类别,我想执行以下查询:

给我最接近这个特定纬度/经度组合的驱动程序,但只给我每个类别的第一个

是否可以使用ElasticSearch执行此操作?我想这是一个延伸,我可以轻松地用geo_distance查询和结果的一些手动过滤来替换它,但如果我可以直接从存储中获取它,那就太棒了。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

{
  "_source": true, 
  "query":{
    "match_all": {}
  },
  "sort" : {
    "_script" : {
      "type" : "number",
      "script" : {
        "lang": "painless",
        "source": "(20 - doc['lat'].value) * (20 - doc['lat'].value) + (50 - doc['lon'].value) * (50 - doc['lon'].value)"
      },
      "order" : "asc"
    }
  }
}

这将根据您在脚本中提供的位置(在本例中为{20; 50})按距离的平方(将提供与常规距离相同的排序)对您的记录进行排序。但我认为你必须为每个类别运行它。您可以限制搜索的结果大小,但不能限制搜索的部分内容。因此,您需要更改该查询以过滤一个类别。

  

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html