ElasticSearch将嵌套字段重新索引为新文档

时间:2018-09-20 07:01:58

标签: elasticsearch nested reindex

我当前正在更改我的ElasticSearch架构。 我以前在索引中有一个类型Product,带有嵌套字段Product.users。 现在,我想获得2个不同的索引,一个用于Product,另一个用于User,并在代码中建立两者之间的链接。

我使用reindex API将我所有的Product文档重新索引到新索引,并使用脚本删除了Product.users字段:

  

ctx._source.remove('users');

但是我不知道如何将我所有的Product.users文档重新索引到新的User索引中,就像在脚本中一样,我将得到一个users的ArrayList,我想创建一个每个User个文档。

有人知道如何实现吗?

3 个答案:

答案 0 :(得分:0)

对于那些可能会遇到这种情况的人,我最终使用var filter1 = { address: 'England', name: 'Mark' }; var filter2 = { address: 'England', name: '' }; var users = [ { name: 'John', email: 'johnson@mail.com', age: 25, address: 'USA' }, { name: 'Tom', email: 'tom@mail.com', age: 35, address: 'England' }, { name: 'Mark', email: 'mark@mail.com', age: 28, address: 'England' } ]; function filterUser(arr, obj) { return arr.filter(function(item) { return ( (obj.address === '' || item.address === obj.address) && (obj.name === '' || item.name === obj.name) ); }); } console.log(filterUser(users, filter1)); console.log(filterUser(users, filter2));users API重新索引scroll嵌套字段。

  • 我使用bulk API来获取scroll个文档的批处理
  • 对于每一批,迭代这些Product文档
  • 对于每个文档,迭代Product
  • 创建一个新的Product.users文档并将其添加到批量
  • 当我结束对User批处理的迭代时,发送批量

完成工作<3

答案 1 :(得分:0)

您需要的是ETL(提取,转换,加载)。

大多数时候,编写一个完全可以满足您需要的小python脚本比较方便,但是,使用elasticsearch时,我喜欢一个:Apache Spark + elasticsearch4hadoop插件。

此外,有时logstash可以解决问题,但是使用Spark可以:

  • SQL语法或支持Java / Scala / Python代码
  • 由于分布式工作程序(1个ES碎片= 1个Spark工作程序),因此读/写Elasticsearch的速度非常快
  • 容错(工人崩溃?没问题)
  • 聚类(如果您有数十亿个文档,则是理想选择)

与Apache Zeppelin(装有Spark且已准备好包装的笔记本)一起使用,您一定会喜欢的!

答案 2 :(得分:0)

我能想到的最简单的解决方案是运行两次reindex命令。选择“产品”字段并重新索引到newProduct索引中,然后一次给用户:

POST _reindex
{
  "source": {
    "index": "Product",
    "type": "_doc",
    "_source": ["fields", "to keep in", "new Products"]
    "query": {
        "match_all": {}
    }
  },
  "dest": {
    "index": "new_Products"
  }
}

然后,您应该能够通过仅在第二次重新索引中选择Product.users在new_User表上再次进行重新索引