我正在索引一个如下所示的文档:
{
"driverId": 1234,
"category": "SIMPLE",
"location": {
"lat": -40,
"lon": 10
}
}
我在这个索引中有3个不同的类别,我想执行以下查询:
给我最接近这个特定纬度/经度组合的驱动程序,但只给我每个类别的第一个
是否可以使用ElasticSearch
执行此操作?我想这是一个延伸,我可以轻松地用geo_distance
查询和结果的一些手动过滤来替换它,但如果我可以直接从存储中获取它,那就太棒了。
答案 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