2014-07-16 9 views

ответ

3

Вам необходимо использовать elasticsearch Bulk API. Он позволяет вставлять несколько элементов с одним запросом. Запросы вывешены на специальной конечной точке /_bulk и выглядеть следующим образом:

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } } 
{ "field1" : "value1" } 
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "2" } } 
{ "field1" : "value2" } 
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "3" } } 
{ "field1" : "value3" } 
+5

@ konstantin-v-salkhov Что делать, если я хочу вставить документы для одного и того же индекса и того же типа и хочу использовать автоматически сгенерированные идентификаторы, есть ли возможность набрать: '{" index ": {" _index ":" test "," _type ":" type1 "}}' только один раз, а затем только сами документы? Наверное, нет, поскольку я не мог найти его в документации, но это было бы неплохой функцией. – Tadzys

+0

autogenerated ids действительно работают с действием «index» –

0

не хватает кармы на комментарий в ответ на @Tadzys, но да, навалочных вкладывание документов на один или несколько индексов без идентификатора кажется выполнимым , См. «Вставка документов, относящихся к разным типам и индексам в одном запросе», в Elasticsearch: Bulk Inserting Examples.

Из указанной страницы:

POST http://path.to.your.cluster/_bulk 
{ "index":{ "_index": "myIndex", "_type": "person" } } 
{ "name":"john doe","age":25 } 
{ "index":{ "_index": "myOtherIndex", "_type": "dog" } } 
{ "name":"fido","breed":"chihuahua" } 

"Примеры работы для версий Elasticsearch 1.x, 2.x и, вероятно, более поздних тоже."

1

Лучше поздно, чем никогда. Это, как я сделал завиток запрос на упругом сервер сбросить несколько записей с помощью основной массы API

curl -XPOST 'http://<my_host_name>:9201/_bulk?pretty' -H 'Content-Type: application/json' -d '{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "1"} }{"id" : "AAA" , "name" : "AAAAAAAAAAAAAA"}{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "2"} }{"id" : "BBB" , "name" : "BBBBBBBBBBBBBBB"}{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "3"} }{"id" : "CCC" , "name" : "CCCCCCCCCCCCCCCC"}{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "4"} }{"id" : "DDD" , "name" : "DDDDDDDDDDDDDDDDDD"}{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "5"} }{"id" : "EEE" , "name" : "EEEEEEEEEEEEEEEEEE"}' 

P.S: Эластичный 5.x (по крайней мере), кажется, не позволяют создать насыпной без атрибута идентификатора. Пришлось мучительно придумать один за 100-е из таких записей

+0

Есть ли способ генерировать данные в таком формате из другого индекса упругости? –

+0

[Hari K Murthy] (https://stackoverflow.com/users/2960499/hari-k-murthy) любая причина не использовать ** "index" ** действие вместо ** "create" ** если вы хотите автогенерированные идентификаторы? из того, что я понимаю, единственное различие между этими двумя конечными точками состоит в том, что ** «создать» ** требует идентификатора и будет терпеть неудачу в случае дубликатов. –

0

Все ответы выше правильные. У меня есть более конкретный для вас.

порт , а не 9201 как ответ @Hari K Murthy. Или, может быть, есть и другие конфигурации.

Почтовый адрес: http://127.0.0.1:9200/_bulk?pretty. Вы можете изменить свой собственный IP-адрес.

Опубликовано JSON является:

{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "1"} } 
{"id" : "AAA" , "name" : "AAAAAAAAAAAAAA"} 
{ "create" : { "_index" : "my_index", "_type" : "my_document_type", "_id" : "2"} } 
{"id" : "BBB" , "name" : "BBBBBBBBBBBBBBB"} 

например: use bulk api in postman

ПРИМЕЧАНИЕ: Вы должны отформатировать JSON как один метаданных линии, другой линии данных как bulk api doc говорит.

Смежные вопросы