我在弹性搜索中有一个包含元素列表的字段,我想确保此列表中没有重复的元素,我对应用程序进行了更改,有没有一种方法可以运行ES命令来更新已经建立索引的文件。
答案 0 :(得分:0)
抱歉,这有点晚了,但这可以通过两种方式完成:
假设我有以下文件:
__next__
POST sourceindex/mydocs/1
{
"myIntegerArray": [1,2,3,4,5,5,6],
"myStringArray" : [ "Chelsea", "Manu", "Arsenal", "Arsenal"]
}
在这里,您需要执行重新索引,这与更新查询不同,这需要您从POST sourceindex/_update_by_query
{
"script": {
"lang": "painless",
"source": """
int size = ctx._source['myIntegerArray'].size();
int i=0;
Set myset = new HashSet();
for(ListIterator it = ctx._source['myIntegerArray'].listIterator(); it.hasNext();){
i = it.next();
it.remove();
myset.add(i);
}
ctx._source['myIntegerArray'].addAll(myset);
"""
}
}
重新索引,并且如果索引您需要从sourceindex -> destinationindex
重新索引到destinationindex
如果您不使用任何别名功能,则打算使用sourceindex
。建议您看看Ingest功能
打破步骤:
sourceindex
Create ingestion pipeline
Create dest_index
Apply reindex operation using pipeline to ingest from source_index to dest_index
PUT _ingest/pipeline/my-pipeline
{
"description" : "duplicate removal pipeline",
"processors" : [
{
"script": {
"lang": "painless",
"source": """
int size = ctx.myIntegerArray.size();
int i=0;
Set myset = new HashSet();
for(ListIterator it = ctx.myIntegerArray.listIterator(); it.hasNext();)
{
i = it.next();
it.remove();
myset.add(i);
}
ctx.myIntegerArray.addAll(myset);
"""
}
}]
}
请注意,我已经创建了此管道来删除重复的整数。您可以类似的方式使用POST _reindex
{
"source": {
"index": "sourceindex"
},
"dest": {
"index": "destinationindex",
"pipeline": "my-pipeline"
}
}
。唯一需要做的更改是,将行String
更改为int i=0
(很抱歉此处的编码标准),并将String i = null;
更改为myIntegerArray
希望对您有帮助!