如何在不删除先前数据的情况下重新索引到现有索引

时间:2021-03-02 19:53:14

标签: elasticsearch

我正在使用 reindex API 将数据从旧格式转换为新格式,如下所示:

POST /_reindex
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  },
  "script": {
    "source": """
    ArrayList convertField(def str) {
      // [complicated conversion]
      return reformatted_data;
    }
  
    ctx._source.specific_field = convertField(ctx._source.specific_field);
    """
  }
}

为了进行负载测试,我想将数据复制到新索引中(不需要完全相同,一些脚本化的更改就可以了)。

问题是,每次我运行重新索引时,目标索引中的所有数据都会被删除并替换为新批次。如何保留当前数据并添加到其中而不是替换?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用脚本字段将重新索引文档的 _id 字段设置为 null。这将为重新索引的文档生成一个新的 GUID。在你的情况下:

POST /_reindex

{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  },
  "script": {
    "source": """
    ArrayList convertField(def str) {
      // [complicated conversion]
      return reformatted_data;
    }
  
    ctx._source.specific_field = convertField(ctx._source.specific_field);
    ctx._id = null
    """
  }
}

答案 1 :(得分:0)

原因是给定的 #include <iostream> #include <vector> #include <unordered_map> using namespace std; vector<int> parent; vector<int> values; vector<int> r; unordered_map<int, int> m; int find(int s) { if (parent[s] == s) { return s; } return parent[s] = find(parent[s]); } void unite(int a, int b) { a = find(a); b = find(b); if (a != b) { if (r[a] < r[b]) { parent[a] = b; } else if(r[a] > r[b]) { parent[b] = a; } else { parent[b] = a; r[a] += 1; } } } void solve() { int n; cin >> n; parent.resize(n); values.resize(n); r.resize(n); int ans = 0; for (int i = 0; i < n; i++) { cin >> values[i]; parent[i] = i; r[i] = 1; } int p; cin >> p; while (p--) { int f, s; cin >> f >> s; f = f - 1; s = s - 1; int f1 = find(f); int f2 = find(s); if (f1 != f2) { unite(f1, f2); } } // compression one more time to confirm the integrary of group number for (int i = 0; i < n; i++) find(i); for (int i = 0; i < n; i++) { if (m.find(parent[i]) != m.end()) { m[parent[i]] = m[parent[i]] + values[i]; ans = max(ans, m[parent[i]]); } else { m[parent[i]] = values[i]; ans = max(ans, m[parent[i]]); } } cout << ans << endl; m.clear(); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // #ifndef ONLINE_JUDGE // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); // #endif // ONLINE_JUDGE solve(); } 只能是一个文档。

对于我的测试,我所做的只是编辑每个 _id

_id