要从源复制特定数据时,脚本在重新索引操作中无法正常工作

时间:2019-02-14 05:27:00

标签: elasticsearch

弹性版本为6.3

这是脚本,然后尝试... 创建了一个“演示”索引

PUT demo
{
"mappings": {
"doc":{
"properties": {
"field1":{
"type": "long"
},
"field2":{
"type": "text"
}
}
}
}
}

现在插入了两个文档

PUT demo/doc/12_1
{
"field1":12,
"field2":"text1"
}
PUT demo/doc/13_1
{
"field1":13,
"field2":"text2"
}

现在又创建了一个索引演示程序,具有与上面相同的映射

PUT demo1
{
"mappings": {
"doc":{
"properties": {
"field1":{
"type": "long"
},
"field2":{
"type": "text"
}
}
}
}
}

现在我只想将“ field2”数据复制到“ demo1”中,但我的新索引的“ _id”将与“ demo”的“ field1”相同,因此我按照以下脚本运行。

POST _reindex
{
"source": {
"index": "demo",
"_source":"field2"
},
"dest": {
"index": "demo1"
},
"script": {
"source": "ctx._id = ctx._source['field1']"
}
}

但输出是

"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "demo1",
"_type": "doc",
"_id": "G9G_6GgB47Hb5C908ES1",
"_score": 1,
"_source": {
"field2": "text2"
}
},
{
"_index": "demo1",
"_type": "doc",
"_id": "GtG_6GgB47Hb5C908ES1",
"_score": 1,
"_source": {
"field2": "text1"
}
}
]
}

此处“ _id”是随机生成的。 如果我删除“ _source”:“ field2”,则正确生成了“ _id”。

请提出一些可以实现正确行为的建议。

再见,谢谢。

2 个答案:

答案 0 :(得分:2)

field1添加到源索引块中的_source,然后在将其值用作_id作为目标之后,通过脚本将其删除。 在下面使用:

{
  "source": {
    "index": "demo",
    "_source": ["field2", "field1"]
  },
  "dest": {
    "index": "demo1"
  },
  "script": {
    "source": "ctx._id = ctx._source['field1']; ctx._source.remove('field1');"
  }
}

您也可以完全忽略源代码块中的_source。下面将把demo索引以外的所有字段复制到demo1field1之外的所有字段。

{
  "source": {
    "index": "demo"
  },
  "dest": {
    "index": "demo1"
  },
  "script": {
    "source": "ctx._id = ctx._source['field1']; ctx._source.remove('field1');"
  }
}

答案 1 :(得分:1)

这是因为在_source中,您仅包含源索引中的field2。改为这样:

POST _reindex
{
  "source": {
    "index": "demo",
    "_source": ["field1", "field2"]     <--- add field1 here
  },
  "dest": {
    "index": "demo1"
  },
  "script": {
    "source": "ctx._id = ctx._source['field1']; ctx._source.remove('field1')"
  }
}