Імпортуйте / проіндексуйте файл JSON у Elasticsearch


89

Я новачок у Elasticsearch і до цього моменту вводив дані вручну. Наприклад, я зробив щось подібне:

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

Тепер у мене є файл .json, і я хочу індексувати його в Elasticsearch. Я теж пробував щось подібне, але успіху немає:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json

Як імпортувати файл .json? Чи потрібно робити перші кроки, щоб переконатися, що відображення правильне?


Відповіді:


89

Правильна команда, якщо ви хочете використовувати файл із curl, така:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json

Elasticsearch не має схеми, тому вам не обов’язково потрібне відображення. Якщо ви надішлете файл json таким, який він є, і використовуєте відображення за замовчуванням, кожне поле буде проіндексовано та проаналізовано за допомогою стандартного аналізатора .

Якщо ви хочете взаємодіяти з Elasticsearch через командний рядок, ви можете поглянути на elastichell, який повинен бути трохи зручнішим, ніж curl.

2019-07-10: Слід зазначити, що власні типи зіставлення застаріли та не повинні використовуватися. Я оновив тип у вказаній вище URL-адресі, щоб було легше зрозуміти, що таке індекс, а який тип, оскільки наявність обох назв "тест" заплутало.


1
Я не працюю для мене, коли я вводжу вашу команду, консоль не надає жодних даних.
Конрад

2
@Konrad ви замінили jfblouvmlxecs01на localhost, так?
Ехтеш Чоудхурі,

2
clwen - "@" повідомляє curl завантажувати дані з файлу json.
Олівер,

1
привіт, я також новачок у еластичному пошуку. Чи може хтось підказати мені, де зберігати ці файли .json?
swaheed

2
Де зберігати файл JSON?
AV94

26

Відповідно до поточних документів, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Якщо ви надаєте введення текстового файлу для завивки, ви повинні використовувати прапорець --data-binary замість plain -d. Останній не зберігає нові рядки.

Приклад:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

1
Зверніть увагу, що файл json _bulk load не є дійсним дійсним файлом json; синтаксис наведено у посиланні _bulk API. Крім того, вам не потрібно вводити _id, як зазначено в цих прикладах; автоматично згенерований _id буде надано, коли _id пропущено.
Стів Тарвер,

16

Ми зробили невеликий інструмент для такого типу речей https://github.com/taskrabbit/elasticsearch-dump


6
Наведені приклади не охоплюють поставлене тут питання. Чи буде це працювати, якщо ми надаємо файл json як вхідні дані, а еластичну URL-адресу пошуку як вихідний результат?
jgr0

11

Я автор elasticsearch_loader,
я написав ESL саме для цієї проблеми.

Ви можете завантажити його за допомогою pip:

pip install elasticsearch-loader

І тоді ви зможете завантажувати файли JSON у еластичний пошук, видаючи:

elasticsearch_loader --index incidents --type incident json file1.json file2.json

Це добре! Він додає обов’язковий indexрядок перед кожним документом.
dr0i

2018-10-04 11: 51: 40.395741 Спроба ПОМИЛКИ [1/1] отримала виняток, це постійна втрата даних, більше немає спроби. - Помилка ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Час очікування прочитаний. (Час очікування = 10.0))) під час обробки
Chiel,

Окрім того, що це не працює, де ви вказуєте URL-адресу та порт?
Chiel

Ви можете відвідати сторінку GitHub або запустити elasticsearch_loader --help, щоб переглянути повне повідомлення про допомогу. Ви можете вказати хост: порт за допомогою--es-host http://hostname:port
MosheZada

Приємно. За винятком того, що --typeстає зайвим, оскільки Elasticsearch видаляє типи у 6 версіях elastic.co/guide/en/elasticsearch/reference/6.0/…
Влад Т.

8

Додавання до відповіді KenH

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Ви можете замінити @requestsна@complete_path_to_json_file

Примітка: @важливо перед шляхом до файлу


можеш дати якийсь приклад шляху. я даю "@c: \ accounts.json" і розміщую його там навіть тоді, його не вдається знайти
Піюш Міттал

4
це має бути @ "c: \ accounts.json"
Рам Пратап,

додати прапор заголовка, як -H "Content-Type: application / json"
Shady Kip

8

Одного я не бачив, щоб хтось згадував: файл JSON повинен мати один рядок із зазначенням індексу, до якого належить наступний рядок, для кожного рядка "чистого" файлу JSON.

IE

{"index":{"_index":"shakespeare","_type":"act","_id":0}}
{"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}

Без цього нічого не працює, і це не скаже вам, чому


8

Я просто переконався, що перебуваю в тому ж каталозі, що і файл json, а потім просто запустив це

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

Тож якщо ви теж переконайтесь, що знаходитесь в одному каталозі, і запустіть його таким чином. Примітка: product / default / в команді є чимось специфічним для мого середовища. ви можете пропустити це або замінити на те, що стосується вас.


6

просто дістаньте листоношу з https://www.getpostman.com/docs/environments і надайте йому розташування файлу за допомогою команди / test / test / 1 / _bulk? pretty. введіть тут опис зображення


2
{"error": "не знайдено обробника для uri [/ test / test / 1 / _bulk? pretty] та методу [POST]"}
Chiel,

{"помилка": "Заголовок типу вмісту [text / plain] не підтримується", "статус": 406}
X. L

5

Ви використовуєте

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Якщо `` запити '' є файлом json, то вам доведеться змінити це на

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json

Тепер перед цим, якщо ваш файл json не проіндексований, вам потрібно вставити рядок індексу перед кожним рядком усередині файлу json. Ви можете зробити це за допомогою JQ. Посилання нижче: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Перейдіть до підручників elasticsearch (приклад підручника Шекспіра) і завантажте використаний зразок файлу json і подивіться на нього. Перед кожним об'єктом json (кожним окремим рядком) є рядок індексу. Це те, що ви шукаєте після використання команди jq. Цей формат є обов'язковим для використання масового API, звичайні файли json не працюють.


1

Починаючи з Elasticsearch 7.7, ви також повинні вказати тип вмісту:

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>

0

якщо ви використовуєте в ньому VirtualBox та UBUNTU, або ви просто використовуєте UBUNTU, тоді це може бути корисно

wget https://github.com/andrewvc/ee-datasets/archive/master.zip
sudo apt-get install unzip (only if unzip module is not installed)
unzip master.zip
cd ee-datasets
java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader


0
  • Якщо ви використовуєте еластичний пошук 7.7 або новішої версії, то виконуйте команду нижче.

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"

  • Угорі шлях до файлу - /Users/waseem.khan/waseem/elastic/account.json.

  • Якщо ви використовуєте еластичну версію 6.x, тоді ви можете скористатися наведеною нижче командою.

curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'

Примітка : Переконайтеся, що у своєму .json- файлі в кінці ви додасте один порожній рядок, інакше ви отримаєте нижче винятку.

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
],
"type" : "illegal_argument_exception",
"reason" : "The bulk request must be terminated by a newline [\n]"
},
`enter code here`"status" : 400
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.