如何组合来自两个索引的结果



我在Elasticsearch中有CDR日志条目,格式如下。在创建此文档时,我将没有关于delivery_status字段的信息。

{
msgId: "384573847",
msgText: "Message text to be delivered"
submit_status: true,
...
delivery_status: //comes later
}

稍后当交付状态可用时,我可以更新此记录。

但是我已经看到更新查询降低了摄取率。对于使用批量操作的纯插入,我可以达到3000或更多事务/秒,但是如果我结合更新,摄取速率变得非常慢,并且爬行速度为100或更少txns/秒。

所以,我想我可以像下面这样创建另一个索引,在那里我存储交付状态以及msgId:

{
msgId:384573847,
delivery_status: 0
}

使用这种方法,我最终得到2个索引(类似于RDBMS中的主-详细表)。是否有一种方法可以通过连接这些索引来查询记录?我听说过别名,但不能完全理解它的概念,是否可以应用在我的用例中。

感谢所有给我建议的人。

正如您提到的,您可以在单独的索引中对文档进行索引,并使用Elasticsearch的折叠功能检索这两个文档。

考虑一下,您在index2index3中有索引文档,并且两者都有共同的msgId,那么您可以使用以下查询:

POST index2,index3/_search
{
"query": {
"match_all": {}
},
"collapse": {
"field": "msgId",
"inner_hits": {
"name": "most_recent",
"size": 5
}
}
}

但是,同样,您需要考虑使用大数据集查询性能。您可以做一些基准测试,评估查询性能,并决定索引或查询时间将更好。

关于别名,目前在上述查询中,我们提供index2,index3作为索引名。(逗号分隔)。但是如果您使用别名,那么您可以使用一个统一的名称来查询两个索引。

您可以使用下面的命令将两个索引添加到单个别名:

POST _aliases
{
"actions": [
{
"add": {
"index": "index3",
"alias": "order"
}
},
{
"add": {
"index": "index2",
"alias": "order"
}
}
]
}

现在你可以使用下面的查询用别名代替索引名:

POST order/_search
{
"query": {
"match_all": {}
},
"collapse": {
"field": "msgId",
"inner_hits": {
"name": "most_recent",
"size": 5
}
}
}

最新更新