Подтвердить что ты не робот

Есть ли способ импортировать json файл (содержащий 100 документов) на сервер elasticsearch.?

Есть ли способ импортировать JSON файл (содержащий 100 документов) на сервер elasticsearch? Я хочу импортировать большой файл json в es-server.

4b9b3361

Ответ 1

Вы должны использовать Bulk API. Обратите внимание, что вам нужно будет добавить строку заголовка перед каждым документом json.

$ cat requests
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests; echo
{"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1,"ok":true}}]}

Ответ 2

Как уже упоминалось выше, основной API-интерфейс - это, вероятно, путь. Чтобы преобразовать файл для массового протокола, вы можете использовать jq.

Предполагая, что файл содержит только сами документы:

$ echo '{"foo":"bar"}{"baz":"qux"}' | 
jq -c '
{ index: { _index: "myindex", _type: "mytype" } },
. '

{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}

И если файл содержит документы в списке верхнего уровня, их нужно сначала распаковать:

$ echo '[{"foo":"bar"},{"baz":"qux"}]' | 
jq -c '
.[] |
{ index: { _index: "myindex", _type: "mytype" } },
. '

{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
Флаг

jq -c гарантирует, что каждый документ находится в отдельной строке.

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

Ответ 3

Я уверен, что кто-то хочет этого, чтобы я мог легко найти.

FYI. Используется Node.js (по существу, как пакет script) на том же сервере, что и новый экземпляр ES. Запустил его на 2 файла по 4000 элементов каждый, и это заняло около 12 секунд на моем общем виртуальном сервере. YMMV

var elasticsearch = require('elasticsearch'),
    fs = require('fs'),
    pubs = JSON.parse(fs.readFileSync(__dirname + '/pubs.json')), // name of my first file to parse
    forms = JSON.parse(fs.readFileSync(__dirname + '/forms.json')); // and the second set
var client = new elasticsearch.Client({  // default is fine for me, change as you see fit
  host: 'localhost:9200',
  log: 'trace'
});

for (var i = 0; i < pubs.length; i++ ) {
  client.create({
    index: "epubs", // name your index
    type: "pub", // describe the data thats getting created
    id: i, // increment ID every iteration - I already sorted mine but not a requirement
    body: pubs[i] // *** THIS ASSUMES YOUR DATA FILE IS FORMATTED LIKE SO: [{prop: val, prop2: val2}, {prop:...}, {prop:...}] - I converted mine from a CSV so pubs[i] is the current object {prop:..., prop2:...}
  }, function(error, response) {
    if (error) {
      console.error(error);
      return;
    }
    else {
    console.log(response);  //  I don't recommend this but I like having my console flooded with stuff.  It looks cool.  Like I'm compiling a kernel really fast.
    }
  });
}

for (var a = 0; a < forms.length; a++ ) {  // Same stuff here, just slight changes in type and variables
  client.create({
    index: "epubs",
    type: "form",
    id: a,
    body: forms[a]
  }, function(error, response) {
    if (error) {
      console.error(error);
      return;
    }
    else {
    console.log(response);
    }
  });
}

Надеюсь, что я могу помочь больше, чем просто с этим. Не ракетостроение, но может спасти кого-то 10 минут.

Приветствия

Ответ 4

jq - легкий и гибкий процессор JSON с командной строкой.

Использование:

cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-

Занимали файл file.json и отправляли его содержимое в jq с флагом -c для создания компактного вывода. Heres the самородок: воспользовались тем фактом, что jq может создавать не только один, но и несколько объектов на строку ввода. Для каждой строки были созданы элементы управления JSON Elasticsearch (с идентификатором от нашего исходного объекта) и создание второй строки, которая является только нашим исходным объектом JSON (.).

На этом этапе наш JSON отформатировал способ использования API-интерфейсов Elasticsearchs API, поэтому мы просто подключаем его к завиткам, которые POST файлы соответствуют Elasticsearch!

Кредит отправляется Кевин Марш

Ответ 5

Импортировать нет, но вы можете индексировать документы с помощью ES API.

Вы можете использовать индекс api для загрузки каждой строки (используя какой-то код для чтения файла и создания завихренных вызовов) или индексный массив api для загрузки всех них. Предполагая, что ваш файл данных может быть отформатирован для работы с ним.

Подробнее здесь: ES API

Простая оболочка script сделала бы трюк, если бы вам было удобно с оболочкой что-то вроде этого (не тестировалось):

while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json

Перонально, я бы, вероятно, использовал Python либо pyes, либо клиент эластичного поиска.

pyes на github
эластичный клиент python для поиска

Stream2es также очень полезно для быстрой загрузки данных в es и может иметь способ просто передать файл. (I не протестировали файл, но использовали его для загрузки документа wikipedia для тестирования es perf)

Ответ 6

Stream2es - самый простой способ для ИМО.

например предполагается, что файл "some.json" содержит список документов JSON, по одному на строку:

curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type

Ответ 7

Вы можете использовать esbulk, быстрый и простой указатель на объем:

$ esbulk -index myindex file.ldj

Здесь asciicast показывает, что он загружает данные Project Gutenberg в Elasticsearch примерно за 11 секунд.

Отказ от ответственности: я автор.

Ответ 8

вы можете использовать Elasticsearch Gatherer Plugin

Плагин сборщика для Elasticsearch является основой для масштабируемого сбора и индексирования данных. Контентные адаптеры реализованы в архивах zip-архивов сборщиков, которые являются особым видом плагинов, распространяемых через узлы Elasticsearch. Они могут получать запросы на задание и выполнять их в локальных очередях. Рабочие состояния сохраняются в специальном индексе.

Этот плагин находится в разработке.

Milestone 1 - развертывание почтовых индексов сборщиков узлов

Milestone 2 - спецификация и исполнение задания

Milestone 3 - перенос реки JDBC на сборщик JDBC

Milestone 4 - распределение вакансий сборщика по нагрузке/длине очереди / node имя, задания cron

Milestone 5 - больше сборщиков, больше адаптеров контента

ссылка https://github.com/jprante/elasticsearch-gatherer

Ответ 9

Один из способов - создать bash script, который выполняет объемную вставку:

curl -XPOST http://127.0.0.1:9200/myindexname/type/_bulk?pretty=true --data-binary @myjsonfile.json

После запуска вставки запустите эту команду, чтобы получить счетчик:

curl http://127.0.0.1:9200/myindexname/type/_count