如何将子文档添加到ElasticSearch索引

时间:2014-01-24 18:14:04

标签: elasticsearch

在ElasticSearch中,给定以下文档,是否可以在不传递父属性(即消息和标记)的情况下将项添加到“Lists”子文档? 我在父文档中有几个属性,每次我想在子文档中添加一个项目时都不想传递。

{
"tweet" : {
    "message" : "some arrays in this tweet...",
    "tags" : ["elasticsearch", "wow"],
    "lists" : [
        {
            "name" : "prog_list",
            "description" : "programming list"
        },
        {
            "name" : "cool_list",
            "description" : "cool stuff list"
        }
    ]
}

}

1 个答案:

答案 0 :(得分:6)

您正在寻找的是,如何插入嵌套文档。

在您的情况下,您可以使用Update API将嵌套文档附加到列表中。

curl -XPOST localhost:9200/index/tweets/1/_update -d '{
    "script" : "ctx._source.tweet.lists += new_list",
    "params" : {
        "new_list" : {"name": "fun_list", "description": "funny list" }
    }
}'

要支持嵌套文档,您必须定义映射,其描述为here

假设您的类型为tweets,则下面的映射应该有效:

curl -XDELETE http://localhost:9200/index

curl -XPUT http://localhost:9200/index -d'
{
   "settings": {
      "index.number_of_shards": 1,
      "index.number_of_replicas": 0
   },
   "mappings": {
      "tweets": {
         "properties": {
            "tweet": {
               "properties": {
                  "lists": {
                     "type": "nested",
                     "properties": {
                        "name": {
                           "type": "string"
                        },
                        "description": {
                           "type": "string"
                        }
                     }
                  }
               }
            }
         }
      }
   }
}'

然后添加第一个条目:

curl -XPOST http://localhost:9200/index/tweets/1 -d '
{
   "tweet": {
      "message": "some arrays in this tweet...",
      "tags": [
         "elasticsearch",
         "wow"
      ],
      "lists": [
         {
            "name": "prog_list",
            "description": "programming list"
         },
         {
            "name": "cool_list",
            "description": "cool stuff list"
         }
      ]
   }
}'

然后添加您的元素:

curl -XPOST http://localhost:9200/index/tweets/1/_update -d '
{
   "script": "ctx._source.tweet.lists += new_list",
   "params": {
      "new_list": {
         "name": "fun_list",
         "description": "funny list"
      }
   }
}'