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?

Shawn Roller
sumber

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.

javanna
sumber
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
KenH
sumber
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

Evan
sumber
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
MosheZada
sumber
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

Greg Dougherty
sumber
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

Ram Pratap
sumber
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.

Gajendra D Ambi
sumber
6

dapatkan saja tukang pos dari https://www.getpostman.com/docs/environments berikan lokasi file dengan perintah / test / test / 1 / _bulk? pretty. masukkan deskripsi gambar di sini

Piyush Mittal
sumber
2
{"error": "tidak ada penangan yang ditemukan untuk uri [/ test / test / 1 / _bulk? pretty] dan metode [POST]"}
Chiel
{"error": "Header Jenis Konten [teks / biasa] tidak didukung", "status": 406}
X. L
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.

MLS
sumber
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>
thSoft
sumber
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
waseem khan
sumber
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
sudarshan
sumber
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

Yaroslav Gaponov
sumber
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))
Mahan
sumber