gpt4 book ai didi

elasticsearch - 如何在没有偏移的Elasticsearch中对嵌套对象进行分页?

转载 作者:行者123 更新时间:2023-12-03 02:20:10 24 4
gpt4 key购买 nike

我想对Elasticsearch 7.X中的嵌套数组进行分页–在这种情况下,不建议使用fromsize,而是首选search_afterScroll API
将以下带有字段actions的(简化的)模式视为嵌套对象:

{
"protocol" : {
"mappings" : {
"properties" : {
"actions" : {
"type" : "nested",
"properties" : {
"data" : {},
"timestamp" : {
"type" : "date"
},
"type" : {
"type" : "keyword"
},
"user" : {
"type" : "keyword"
}
}
}
}
}
}
}
由于 actions数组可能在15,000-20,000个条目的范围内,因此我想对条目进行分页而不是一次取回所有条目。我只需要一次考虑文档,因此无需将这些条目合并到多个文档中。
我已经尝试使用 inner_hits,使用 date_histogramlog.timestamp和复合聚合进行存储。但是,我无法实现所需的简单分页。桶装似乎是死路一条,因为我必须检索桶中所有项的 ,而不仅仅是任意数量的top_hits
在正确方向上的任何指针都受到高度赞赏,因为我已经在此方面拉了我的头发。
以下是我与inner_hits结合使用的嵌套查询:
POST protocol/_search
{
"_source": "false",
"query": {
"nested": {
"path": "actions",
"query": {
"match": {
"_id": "<document-id>"
}
},
"inner_hits": {}
}
}
}
上面的查询产生以下结果:
{
"took" : 867,
"timed_out" : false,
"_shards" : { ... },
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "protocol",
"_type" : "_doc",
"_id" : "<document-id>",
"_score" : 1.0,
"_source" : { },
"inner_hits" : {
"actions" : {
"hits" : {
"total" : {
"value" : 30,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "protocol",
"_type" : "_doc",
"_id" : "<document-id>",
"_nested" : {
"field" : "actions",
"offset" : 0
},
"_score" : 1.0,
"_source" : {
"actor" : "<user-id>",
"data" : {
... // arbitrary non-indexed payload
},
"type" : "attach",
"timestamp" : "2020-06-24T06:34:00.665Z"
}
},
{
"_index" : "protocol",
"_type" : "_doc",
"_id" : "<document-id>",
"_nested" : {
"field" : "actions",
"offset" : 1
},
"_score" : 1.0,
"_source" : {
"actor" : "<user-id>",
"data" : {
... // arbitrary non-indexed payload
},
"type" : "update",
"timestamp" : "2020-06-23T13:09:04.089Z"
}
},
{
"_index" : "protocol",
"_type" : "_doc",
"_id" : "<document-id>",
"_nested" : {
"field" : "actions",
"offset" : 2
},
"_score" : 1.0,
"_source" : {
"actor" : "<user-id>",
"data" : {
... // arbitrary non-indexed payload
},
"type" : "update",
"timestamp" : "2020-06-23T13:08:58.695Z"
}
}
]
}
}
}
}
]
}
}

最佳答案

经过几次失败的尝试之后,我终于设法解决了这个问题。即使不是最优雅的解决方案,下面的组合聚合也会为嵌套对象中的每个单独项目创建一个单独的存储桶。然后可以以分页的方式取回这些桶。

POST protocol/_search
{
"size": 0,
"query": {
"match": {
"_id": "<document-id>"
}
},
"aggs": {
"actionByUserAndTimestamp": {
"nested": {
"path": "actions"
},
"aggs": {
"log": {
"composite": {
"size": 10,
"sources": [
{
"actionByActor": {
"terms": {
"field": "actions.actor"
}
}
},
{
"actionByTimestamp": {
"terms": {
"field": "actions.timestamp"
}
}
}
]
},
"aggs": {
"items": {
"top_hits": {
"size": 1
}
}
}
}
}
}
}
}
该解决方案的要求是,复合聚合中的指定术语必须是唯一的组合。否则,一个存储桶中可能有多个项目,由于最高匹配量的限制,因此不会考虑该项目。

关于elasticsearch - 如何在没有偏移的Elasticsearch中对嵌套对象进行分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62589417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com