Импорт / индексирование файла 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? Что мне нужно сделать в первую очередь, чтобы убедиться в правильности сопоставления?

Шон Роллер
источник

Ответы:

88

Правильная команда, если вы хотите использовать файл с curl, такова:

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

Elasticsearch не имеет схемы, поэтому отображение не обязательно. Если вы отправляете json как есть и используете сопоставление по умолчанию, каждое поле будет проиндексировано и проанализировано с помощью стандартного анализатора .

Если вы хотите взаимодействовать с Elasticsearch через командную строку, вы можете взглянуть на elasticshell, который должен быть немного удобнее, чем curl.

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

Джаванна
источник
1
У меня не работает, когда я набираю Вашу команду, консоль не предоставляет никаких данных.
Конрад
2
@Konrad вы заменили jfblouvmlxecs01с localhost, не так ли?
Ehtesh Choudhury
2
clwen - "@" указывает curl загружать данные из файла json.
Оливер
1
привет, я также новичок в эластичном поиске, может кто-нибудь, пожалуйста, дайте мне знать, где хранить эти файлы .json?
swaheed
2
Где хранить json файл?
AV94
26

Согласно текущим документам https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Если вы вводите текстовый файл для curl, вы должны использовать флаг --data-binary вместо обычного -d. Последний не сохраняет символы новой строки.

Пример:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
KenH
источник
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, выполнив:

elasticsearch_loader --index incidents --type incident json file1.json file2.json
МошеЗада
источник
Это мило! Он добавляет обязательную indexстроку перед каждым документом.
dr0i 06
2018-10-04 11: 51: 40.395741 Попытка ОШИБКИ [1/1] получила исключение, это постоянная потеря данных, повторная попытка больше не требуется 2018-10-04 11: 51: 40.395741 WARN Чанк 0 получил исключение (ConnectionTimeout, вызванный - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): время ожидания истекло. (Время ожидания чтения = 10.0))) во время обработки
Chiel
Кроме того, что это не работает, где вы указываете URL и порт?
Chiel
Вы можете посетить страницу GitHub или запустить ее elasticsearch_loader --help, чтобы просмотреть полное справочное сообщение. Вы можете указать хост: порт с--es-host http://hostname:port
MosheZada 07
Ницца. За исключением того, что это --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
{"error": "Заголовок Content-Type [text / plain] не поддерживается", "status": 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 работать не будут.

MLS
источник
1

Начиная с Elasticsearch 7.7, вам также необходимо указать тип контента:

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>
thSoft
источник
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

Я написал код для доступа к API Elasticsearch через API файловой системы.

Это хорошая идея, например, для четкого экспорта / импорта данных.

Я создал прототип эластичного привода . Он основан на FUSE

демо

Ярослав Гапонов
источник
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
Васим Хан
источник