elasticsearch - Elasticsearch 获得具有相同字段值的最大 n 个结果
问题描述
我正在尝试从 Elasticsearch 查询中获取随机结果列表,而大多数文档的字段 ( )n
具有相同的值。keyword
field1
我的方法是使用折叠查询并收集每个外部命中的内部命中,将每个内部命中设置为.size
n
这是查询(带n=5
):
{
"query": {
"function_score": {
"query": {
"match": {
"field1": "value1"
}
},
"functions": [
{
"random_score": {}
}
]
}
},
"collapse": {
"field": "field2",
"inner_hits": {
"name": "field2_hits",
"size": 5
}
}
}
结果看起来如预期:
{
...
hits=[
{
"_index": "my_index",
"_type": "_doc",
"_id": "7d0203f72780da89ce349b69985a070b73adad9de79e65c5a1cb316dd2c00504",
"_score": 3.3316212,
"_source": {...},
"fields": {
"field2": [ "value1" ]
},
"inner_hits": {
"field2_hits": {
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 3.3304589,
"hits": [...]
}
...}
在收集内部命中时,我注意到,不同外部命中的内部命中可以是相同的(相同的 id)。
在某种程度上,这似乎是合乎逻辑的,因为可以检索任意数量的带有值的外部命中:X
field2
- 用内部命中B、C、D命中 A(外部命中,
field2
=X) 。 - 用内部命中E、F、G命中 E(外部命中,
field2
=Y) 。 - 用内部命中A、C、D命中 B(外部命中,
field2
=X) 。
因此,如果我收集每个外部命中的所有内部命中,则命中 C 和 D 是重复的。然而,对于我的用例,这不是我想要的。我想我只需要每个值只需要一个外部命中field2
,以便所有内部命中在结果集中都是唯一的。
另一个问题是,设置一个 largen
会给 ES 服务器带来高负载,所以这可能是完全错误的方法。我的问题是:
如何从索引中获取一组 k 个随机文档,其中n
文档最大值对于特定字段具有相同的值?
解决方案
推荐阅读
- node.js - Async.queue 在处理队列的 3 个初始元素后崩溃,并发 = 3
- gated-recurrent-unit - GRU的图表和方程之间的差异?
- reactjs - 反应原生图像源中的条件语句
- c# - 关于 Unity3D SOLID SRP 的建议
- c# - 当用户关闭或按下 Botframework V4 的 web 视图中的按钮时,对话框会自动继续
- excel - 如何使用 MVP 方法将用户窗体文本框值添加到单元格
- jquery - 无法使用 jQuery 读取 textarea 值
- javascript - 如何在不创建重复项的情况下将项目推送到 redux 中的数组
- c# - 将 base64 字符串图像加载到 DocuVieware
- c++ - Gzip分块数据在C ++中分解