elasticsearch 为_source中现有的新字段建立索引

9lowa7mx  于 4个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(68)

我有一个JSON存储在_source中,有n个字段,但不是所有的字段都被索引或存在于索引Map中。如果我需要索引一个新字段或添加一个新字段到_source中已经存在的索引/索引Map中,最好的方法是什么?
我知道的唯一方法是用更新的索引Map重新索引到一个新的索引。
这也带来了下一个好奇心是有一种方法重新索引数据的地方或在同一个索引。
我们保持动态Map为false,所以我们只索引选定的字段。

ki1q1bka

ki1q1bka1#

如果您将动态Map设置为false,这通常是防止Map爆炸并保持对Map的控制的好主意,并且您希望向索引添加新字段,则可以使用update mapping API简单地更新索引Map,然后使用update by query API更新索引。
例如,假设您有以下索引,其中包含单个字段和dynamic false:

PUT test
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "field1": {
        "type": "keyword"
      }
    }
  }
}

字符串
然后索引以下文档:

PUT test/_doc/1
{
  "field1": "Lorem"
}


过了一段时间,您的需求发生了变化,您需要向文档中添加第二个字段,例如下面的字段:

PUT test/_doc/2
{
  "field1": "Lorem",
  "field2": "Ipsum"
}


您可以按field1搜索,并在搜索Lorem时找到这两个文档。但是,按field2搜索不会产生任何结果,因为该字段已被忽略。然而,它在您的源代码中可用。
你需要做的是更新你的Map来添加你的新字段,就像这样:

PUT test/_mapping
{
  "properties": {
    "field1": {
      "type": "keyword"
    },
    "field2": {
      "type": "keyword"
    }
  }
}


此时,所有新索引的文档中的field2都将被正确索引。但是所有以前索引的文档中的field2仍然没有被索引。为此,您需要使用以下update by query调用更新您的数据:

POST test/_update_by_query


当调用返回时,您将能够在所有文档中搜索field2,无论是旧文档还是新文档。在field2中搜索Ipsum将返回具有上述ID的文档。

相关问题