Elasticsearch仅重新索引某些_source参数

时间:2018-08-20 19:43:32

标签: java elasticsearch indexing jest

我有一个性能问题,我正在尝试解决...我正在动态地进行从AWS托管Elasticsearch 6.2中的源索引到目标索引的重新索引。目前,源索引的大小为数百GB,并且在生产中可能更大。因此,重新索引将需要一些时间才能完成。我正在尝试根据业务需求将其最小化。我读到我可以做的一些加快重新索引的操作如下:

1)与集群上的分片数量相比,使用合理数量的分片进行并行处理(例如,理想情况下,10个分片应不超过10个分片运行,剩下的就是浪费和潜在的开销)

2)如果不需要副本副本,则在目标索引上不要使用副本副本,这会增加将数据写入集群的工作

3)使用群集中正确的EC2实例类型来完成此任务

4)仅将源索引中需要的信息复制到索引中。

上面的第4点是我需要指导的地方...我正在Java 8中使用Jest API(v.5.3.3)。有没有一种方法可以执行_rendex查询,但只返回一个或两个字段。 _source,以便我写入目标索引的实际数据只是源大小的一小部分?

1 个答案:

答案 0 :(得分:0)

看来这确实是有可能的,至少在Kibana中是这样:我成功地执行了重新索引,只需在源参数中添加_source即可。如果这看起来有点令人困惑,那么这是我的查询似乎有效:

POST _reindex?slices=10&wait_for_completion=false
{ "conflicts": "proceed",
  "source":{
    "index": "my_source_idx",
    "_source" : "fieldICareAbout",
    "query": { "bool": {
      "filter": { "bool" : { "must" : [
        { "nested": { "path": "medications", "query": { "bool": { "must":[
           { "terms" : { "mds.rowKey": ["USC_4886F"]} },
           { "range" : { "mds.dates" : { "lte": "2018-01-01", "gte": "2010-08-01"} } },
           { "range" : { "mds.datesCount" : { "gte": 2} } },
           { "script" : { "script" : { "id": "min-occurrence-gap-days-criteria-nested", 
              "params" : {"min_occurs" : 1, "dateField": "mds.dates", "rowKey": ["USC_4886F"], "fromDate": "2010-08-01", "toDate": "2018-01-01", "gapDays": 0}}}}
        ]}}}}
      ]}}
    }}
  },
  "dest": {
    "index": "my_dest_index"
  }
}