【发布时间】:2020-12-01 11:24:27
【问题描述】:
我有以下查询 - 工作正常(这可能不是实际查询):
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "location",
"query": {
"geo_distance": {
"distance": "16090km",
"distance_type": "arc",
"location.point": {
"lat": "51.794177",
"lon": "-0.063055"
}
}
}
}
},
{
"geo_distance": {
"distance": "16090km",
"distance_type": "arc",
"location.point": {
"lat": "51.794177",
"lon": "-0.063055"
}
}
}
]
}
}
}
虽然我想做以下事情(作为查询的一部分但不影响现有查询):
- 查找所有具有
field_name=1的文档 - 在所有具有
field_name=1的文档上按地理距离运行排序 - 删除具有
field_name=1且在field_name_2=2下具有相同值的重复项,并在文档结果中保留最接近的项,但删除其余项
更新(进一步解释):
不能使用聚合,因为我们要操作结果中的文档。
同时保持文档内的顺序;意思:
如果我有 20 个文档,按字段排序;我有 5 个 field_name = 1,我想按距离对 5 个进行排序,并消除其中的 4 个;同时仍保持第一类。 (可能在实际查询之前进行地理距离排序和消除?)
不太确定如何执行此操作,感谢任何帮助 - 我目前正在使用 ElasticSearch DSL DRF - 但我可以轻松地将查询转换为 ElasticSearch DSL。
示例文档(操作前):
[{
"field_name": 1,
"field_name_2": 2,
"location": ....
},
{
"field_name": 1,
"field_name_2": 2,
"location": ....
},
{
"field_name": 55,
"field_name_5": 22,
"location": ....
}]
输出(期望):
[{
"field_name": 1,
"field_name_2": 2,
"location": .... <- closest
},
{
"field_name": 55,
"field_name_5": 22,
"location": ....
}]
【问题讨论】:
-
所以您上面的查询返回给定点的给定距离内的所有文档,但它们不是按距离排序的......但是,我不确定您的其他条件
field_name = 1应该如何组合使用该初始查询。你能详细解释一下as part of the query but not affecting the existing query是什么意思吗? -
对不起,如果我没有正确解释自己 - 所以我目前的查询按距离排序和过滤(如上面的查询所示) - 尽管我也想要一个单独的部分(因为不是所有查询都按距离排序)对所有 field_name = 1 的文档进行排序,然后只选择第一个文档(最接近的) - 即找到 field_name = 1 的最接近的文档,然后删除其余文档,但也留下那些文档没有 field_name = 1,原样。
-
好的,因为我没有在你的查询中看到任何排序子句,所以你只是依赖默认的
_score排序,对吧? -
是的@Val,我们只是依赖默认排序
标签: elasticsearch elasticsearch-aggregation elasticsearch-dsl