Impor / Indeks file JSON ke Elasticsearch


90

Saya baru mengenal Elasticsearch dan telah memasukkan data secara manual hingga saat ini. Misalnya saya telah melakukan sesuatu seperti ini:

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

Sekarang saya memiliki file .json dan saya ingin mengindeksnya ke Elasticsearch. Saya sudah mencoba sesuatu seperti ini juga, tetapi tidak berhasil:

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

Bagaimana cara mengimpor file .json? Apakah ada langkah-langkah yang harus saya ambil terlebih dahulu untuk memastikan pemetaan sudah benar?


Jawaban:


89

Perintah yang tepat jika Anda ingin menggunakan file dengan curl adalah ini:

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

Elasticsearch tidak memiliki skema, oleh karena itu Anda tidak perlu pemetaan. Jika Anda mengirim json apa adanya dan Anda menggunakan pemetaan default, setiap bidang akan diindeks dan dianalisis menggunakan penganalisis standar .

Jika Anda ingin berinteraksi dengan Elasticsearch melalui baris perintah, Anda mungkin ingin melihat elasticshell yang seharusnya sedikit lebih praktis daripada curl.

10-07-2019: Perlu diperhatikan bahwa jenis pemetaan khusus sudah tidak digunakan lagi dan tidak boleh digunakan. Saya memperbarui tipe di url di atas untuk memudahkan melihat mana yang merupakan indeks dan mana yang merupakan tipe karena keduanya bernama "test" membingungkan.


1
Saya tidak bekerja untuk saya, ketika saya mengetik Perintah Anda konsol tidak menyediakan data apa pun.
Konrad

2
@ Konrad Anda diganti jfblouvmlxecs01dengan localhost, kan?
Ehtesh Choudhury

2
clwen - "@" memberitahu curl untuk memuat data dari file json.
Oliver

1
hai saya juga baru dalam pencarian elastis adakah yang bisa tolong beri saya di mana untuk menyimpan file .json ini?
swaheed

2
Di mana menyimpan file json?
AV94

27

Sesuai dokumen saat ini, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Jika Anda memberikan input file teks ke curl, Anda harus menggunakan flag --data-binary daripada plain -d. Yang terakhir tidak mempertahankan baris baru.

Contoh:

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

1
Perhatikan bahwa file json pemuatan _bulk bukan file json yang valid; sintaksnya disediakan di tautan API _bulk. Selain itu, Anda tidak perlu memberikan _id seperti yang ditunjukkan dalam contoh ini; _id yang dibuat secara otomatis akan diberikan jika _id dihilangkan.
Steve Tarver

17

Kami membuat alat kecil untuk hal semacam ini https://github.com/taskrabbit/elasticsearch-dump


6
Contoh yang diberikan tidak mencakup pertanyaan yang ditanyakan di sini. Apakah akan berhasil jika kita memberikan file json sebagai input dan url pencarian elastis sebagai output?
jgr0

Saya menggunakan ini untuk mengekspor indeks ke json. Terima kasih.
Krishna Chaitanya Gopaluni

Gunakan perintah berikut. elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data. Hapus 'username:password@'jika Anda tidak perlu.
Krishna Chaitanya Gopaluni

11

Saya penulis elasticsearch_loader
Saya menulis ESL untuk masalah ini.

Anda dapat mendownloadnya dengan pip:

pip install elasticsearch-loader

Dan kemudian Anda akan dapat memuat file json ke elasticsearch dengan menerbitkan:

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

Ini bagus! Ini menambahkan indexbaris wajib sebelum setiap dokumen.
dr0i

2018-10-04 11: 51: 40.395741 Upaya ERROR [1/1] mendapat pengecualian, ini adalah kehilangan data permanen, tidak perlu mencoba lagi 2018-10-04 11: 51: 40.395741 WARN Chunk 0 mendapat pengecualian (ConnectionTimeout disebabkan oleh - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Pembacaan habis waktu. (Read timeout = 10.0))) saat memproses
Chiel

Terlepas dari kenyataan bahwa itu tidak berfungsi, di mana Anda menentukan URL dan porta?
Chiel

Anda dapat mengunjungi halaman GitHub atau menjalankan elasticsearch_loader --helpuntuk melihat pesan bantuan lengkap. Anda dapat menentukan host: port dengan--es-host http://hostname:port
MosheZada

Bagus. Kecuali itu --typemenjadi mubazir karena Elasticsearch menghapus jenis dalam 6 versi elastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.

9

Satu hal yang belum pernah saya lihat siapa pun menyebutkan: file JSON harus memiliki satu baris yang menentukan indeks milik baris berikutnya, untuk setiap baris dari file JSON "murni".

YAITU

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

Tanpa itu, tidak ada yang berhasil, dan tidak akan memberi tahu Anda alasannya


8

Menambah jawaban KenH

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

Anda bisa mengganti @requestsdengan@complete_path_to_json_file

Catatan: @penting sebelum jalur file


dapatkah kamu memberikan beberapa contoh untuk jalan. saya memberikan "@c: \ accounts.json" dan menempatkannya di sana bahkan saat itu, tidak dapat menemukannya
Piyush Mittal

4
seharusnya @ "c: \ accounts.json"
Ram Pratap

tambahkan bendera tajuk seperti so -H "Content-Type: application / json"
Shady Kip

8

Saya hanya memastikan bahwa saya berada di direktori yang sama dengan file json dan kemudian menjalankan ini

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

Jadi jika Anda juga pastikan Anda berada di direktori yang sama dan menjalankannya dengan cara ini. Catatan: produk / default / dalam perintah adalah sesuatu yang spesifik untuk lingkungan saya. Anda dapat menghilangkan atau menggantinya dengan apa pun yang relevan bagi Anda.



5

Anda menggunakan

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

Jika 'request' adalah file json maka Anda harus mengubahnya menjadi

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

Sekarang sebelum ini, jika file json Anda tidak diindeks, Anda harus memasukkan baris indeks sebelum setiap baris di dalam file json. Anda dapat melakukan ini dengan JQ. Lihat tautan di bawah ini: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Buka tutorial elasticsearch (contoh tutorial shakespeare) dan unduh contoh file json yang digunakan dan lihatlah. Di depan setiap objek json (setiap baris) terdapat garis indeks. Inilah yang Anda cari setelah menggunakan perintah jq. Format ini wajib untuk menggunakan API massal, file json biasa tidak akan berfungsi.


2

Pada Elasticsearch 7.7, Anda juga harus menentukan jenis konten:

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

1
  • Jika Anda menggunakan elastic search 7.7 atau versi di atasnya, ikuti perintah di bawah ini.

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

  • Di jalur file di atas adalah /Users/waseem.khan/waseem/elastic/account.json.

  • Jika Anda menggunakan versi elastis search 6.x maka Anda dapat menggunakan perintah di bawah ini.

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

Catatan : Pastikan di file .json Anda di akhir Anda akan menambahkan satu baris kosong jika tidak Anda akan mendapatkan pengecualian di bawah.

"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

0

jika Anda menggunakan VirtualBox dan UBUNTU di dalamnya atau Anda hanya menggunakan UBUNTU maka ini bisa bermanfaat

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

Saya menulis beberapa kode untuk mengekspos API Elasticsearch melalui API Sistem File.

Sebaiknya, misalnya, ekspor / impor data yang jelas.

Saya membuat prototipe elasticdriver . Ini didasarkan pada FUSE

demo


0

Jika Anda ingin mengimpor file json ke Elasticsearch dan membuat indeks, gunakan skrip Python ini.

import json
from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
i = 0
with open('el_dharan.json') as raw_data:
    json_docs = json.load(raw_data)
    for json_doc in json_docs:
            i = i + 1
            es.index(index='ind_dharan', doc_type='doc_dharan', id=i, body=json.dumps(json_doc))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.