2014-01-24 3 views
4

В ElasticSearch, учитывая следующий документ: Можно ли добавлять элементы в под-документ «Списки», не передавая родительские атрибуты (т. Е. Сообщение и теги)? У меня есть несколько атрибутов в родительском документе, которые я не хочу передавать каждый раз, когда хочу добавить один элемент в поддоку.Как добавить поддоку в индекс ElasticSearch

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

}

+0

хау вы строите документ? –

+0

Я строю весь документ как документ json и публикую его с помощью Powershell. – Yasir

ответ

5

То, что вы ищете, как вставлять вложенные документы.

В вашем случае вы можете использовать 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" 
     } 
    } 
}' 
Смежные вопросы