如何在具有不同路由的不同索引中索引同一文档

时间:2019-09-10 22:59:16

标签: elasticsearch bulk

我需要能够用不同的路由值在不同的索引中索引同一文档。

基本上,要解决的问题是能够从付款人和收款人的角度计算有关付款信息的复杂汇总。例如,“在过去15天内按状态分组的付款/收到的款项”

我想知道我们如何使用ElasticSearch批量API实现这一目标。

是否可以在不生成ndjson冗余的情况下实现这一目标?例如:

POST _bulk
{ "index" : { "_index" : "test_1", "_id" : "1", "routing": "1234" } }
{ "index" : { "_index" : "test_2", "_id" : "1", "routing": "5678" } }
{ "field1" : "value1" }

我正在寻找文档,但是找不到一个可以解释这一点的地方。

1 个答案:

答案 0 :(得分:0)

仅使用批量API,您每次都需要重复该文档。

另一种方法是将文档批量索引到第一个索引中,然后使用Reindex API为每个文档创建具有不同路由值的第二个索引。

POST _bulk
{ "index" : { "_index" : "test_1", "_id" : "1", "routing": "1234" } }
{ "field1" : "value1", "routing2": "5678" }

然后您可以使用第二个路由值(需要以某种方式存储在文档中

POST _reindex
{
  "source": {
    "index": "test_1"
  },
  "dest": {
    "index": "test_2"
  },
  "script": {
    "source": "ctx._routing = ctx._source.routing2",
    "lang": "painless"
  }
}

这样,您只需使用批量API索引一次数据,这大约比将所有文档加倍时花费一半的时间,然后通过利用Reindex API,所有数据都将在内部重新索引(即,无需添加网络发送潜在大负载的延迟)