Есть ли способ импортировать JSON файл (содержащий 100 документов) на сервер elasticsearch? Я хочу импортировать большой файл json в es-server.
Есть ли способ импортировать json файл (содержащий 100 документов) на сервер elasticsearch.?
Ответ 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 для загрузки всех них. Предполагая, что ваш файл данных может быть отформатирован для работы с ним.
Простая оболочка 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 - больше сборщиков, больше адаптеров контента
Ответ 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