我当前正在更改我的ElasticSearch架构。
我以前在索引中有一个类型Product
,带有嵌套字段Product.users
。
现在,我想获得2个不同的索引,一个用于Product
,另一个用于User
,并在代码中建立两者之间的链接。
我使用reindex
API将我所有的Product
文档重新索引到新索引,并使用脚本删除了Product.users
字段:
ctx._source.remove('users');
但是我不知道如何将我所有的Product.users
文档重新索引到新的User
索引中,就像在脚本中一样,我将得到一个users
的ArrayList,我想创建一个每个User
个文档。
有人知道如何实现吗?
答案 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可以:
与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表上再次进行重新索引