Bir JSON dosyasını Elasticsearch'e içe aktarın / endeksleyin


90

Elasticsearch'te yeniyim ve bu noktaya kadar verileri manuel olarak giriyorum. Örneğin şöyle bir şey yaptım:

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

Şimdi bir .json dosyam var ve bunu Elasticsearch'e indekslemek istiyorum. Ben de buna benzer bir şey denedim, ama başarılı olamadım:

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

.Json dosyasını nasıl içe aktarırım? Eşlemenin doğru olduğundan emin olmak için önce atmam gereken adımlar var mı?


Yanıtlar:


89

Curl içeren bir dosya kullanmak istiyorsanız doğru komut şudur:

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

Elasticsearch şemasızdır, bu nedenle mutlaka bir haritalamaya ihtiyacınız yoktur. Json'u olduğu gibi gönderirseniz ve varsayılan eşlemeyi kullanırsanız, her alan standart analizör kullanılarak indekslenecek ve analiz edilecektir .

Elasticsearch ile komut satırı üzerinden etkileşim kurmak istiyorsanız, curl'den biraz daha kullanışlı olması gereken elastik kabuğa bir göz atmak isteyebilirsiniz .

2019-07-10: Özel eşleme türlerinin kullanımdan kaldırıldığı ve kullanılmaması gerektiği unutulmamalıdır. Hangisinin indeks olduğunu ve hangisinin "test" olarak adlandırıldığını görmeyi kolaylaştırmak için yukarıdaki url'deki türü güncelledim.


1
Benim için çalışmıyorum, Komutunuzu yazdığımda konsol herhangi bir veri sağlamıyor.
Konrad

2
@Konrad jfblouvmlxecs01ile değiştirdiniz localhost, değil mi?
Ehtesh Choudhury

2
clwen - "@" curl'ye verileri json dosyasından yüklemesini söyler.
Oliver

1
merhaba, elastik aramada da yeniyim, lütfen bu .json dosyalarını nerede saklayacağımı öğrenebilir miyim?
swaheed

2
Json dosyası nerede saklanır?
AV94

27

Mevcut belgelere göre, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Curl için metin dosyası girdisi sağlıyorsanız, düz -d yerine --data-ikili bayrağını kullanmalısınız. İkincisi yeni satırları korumaz.

Misal:

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

1
_Bulk load json dosyasının geçerli bir json dosyası olmadığını unutmayın; sözdizimi _bulk API bağlantısında sağlanır. Ayrıca, bu örneklerde belirtildiği gibi bir _id sağlamanız gerekmez; _id atlandığında otomatik olarak oluşturulan bir _id sağlanacaktır.
Steve Tarver

17

Bu tür şeyler için küçük bir araç yaptık https://github.com/taskrabbit/elasticsearch-dump


6
Verilen örnekler burada sorulan soruyu kapsamamaktadır. Bir girdi olarak json dosyasını ve çıktı olarak elastik arama url'sini verirsek işe yarayacak mı?
jgr0

Bunu dizini json'a aktarmak için kullanıyorum. Teşekkürler.
Krishna Chaitanya Gopaluni

Aşağıdaki komutu kullanın. elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data. 'username:password@'İhtiyacınız yoksa kaldırın .
Krishna Chaitanya Gopaluni

11

Elasticsearch_loader'ın
yazarıyım, bu problem için ESL yazdım.

Pip ile indirebilirsiniz:

pip install elasticsearch-loader

Ve sonra json dosyalarını elasticsearch'e şu şekilde yükleyebileceksiniz:

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

Bu güzel! indexHer belgeden önce zorunlu satırı ekler .
dr0i

2018-10-04 11: 51: 40.395741 HATA girişimi [1/1] istisna aldı, kalıcı bir veri kaybı, artık yeniden deneme yok 2018-10-04 11: 51: 40.395741 WARN Chunk 0 istisna aldı (Bağlantı zaman aşımı - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Okuma zaman aşımına uğradı. (Okuma zaman aşımı = 10.0)))
Chiel

Çalışmadığı gerçeğinin dışında, URL ve bağlantı noktasını nerede belirtiyorsunuz?
Chiel

elasticsearch_loader --helpTam yardım mesajını görüntülemek için GitHub sayfasını ziyaret edebilir veya çalıştırabilirsiniz . Ana bilgisayarı belirtebilirsiniz: bağlantı noktası--es-host http://hostname:port
MosheZada

Güzel. Elasticsearch--type , 6 versiyonundaki türleri kaldırdığından gereksiz hale gelmesi dışında elastik.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.

9

Kimsenin bahsetmediğim bir şey var: JSON dosyası, "saf" JSON dosyasının her satırı için, sonraki satırın ait olduğu dizini belirten bir satıra sahip olmalıdır.

IE

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

O olmadan hiçbir şey işe yaramaz ve sana nedenini söylemeyecek


8

KenH'nin cevabına ekleniyor

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

Sen değiştirebilirsiniz @requestsile@complete_path_to_json_file

Not: @dosya yolundan önce önemlidir


yol için bir örnek verebilir misiniz? "@c: \ accounts.json" veriyorum ve o zaman bile oraya yerleştiriyorum, onu bulamıyorum
Piyush Mittal

4
@ "c: \ accounts.json" olmalıdır
Ram Pratap

-H "Content-Type: application / json" gibi bir başlık bayrağı ekleyin
Shady Kip

8

Sadece json dosyasıyla aynı dizinde olduğumdan emin oldum ve sonra bunu çalıştırdım

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

Yani siz de aynı dizinde olduğunuzdan emin olun ve bu şekilde çalıştırın. Not: komuttaki ürün / varsayılan / ortamıma özgü bir şeydir. onu atlayabilir veya sizinle ilgili olanla değiştirebilirsiniz.



5

Kullanıyorsun

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

'İstekler' bir json dosyasıysa, bunu şu şekilde değiştirmeniz gerekir:

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

Şimdi bundan önce, eğer json dosyanız indekslenmemişse, json dosyası içindeki her satırdan önce bir dizin satırı eklemeniz gerekir. Bunu JQ ile yapabilirsiniz. Aşağıdaki bağlantıya bakın: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Elasticsearch öğreticilerine gidin (örnek shakespeare öğreticisi) ve kullanılan json dosyası örneğini indirin ve ona bir göz atın. Her json nesnesinin (her bir satırın) önünde bir dizin çizgisi vardır. Jq komutunu kullandıktan sonra aradığınız şey budur. Bu biçim toplu API kullanmak için zorunludur, düz json dosyaları çalışmaz.


2

Elasticsearch 7.7'den itibaren, içerik türünü de belirtmeniz gerekir:

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

1
  • Esnek arama 7.7 veya üzeri sürümünü kullanıyorsanız, aşağıdaki komutu izleyin.

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

  • Yukarıdaki dosya yolu üzerinde /Users/waseem.khan/waseem/elastic/account.json.

  • Eğer elastik arama 6.x sürümünü kullanıyorsanız, aşağıdaki komutu kullanabilirsiniz.

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

Not : .json dosyanızın sonuna bir boş satırı ekleyeceğinizden emin olun, aksi takdirde istisnanın altına düşersiniz.

"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

İçinde VirtualBox ve UBUNTU kullanıyorsanız veya sadece UBUNTU kullanıyorsanız, o zaman faydalı olabilir

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

Elasticsearch API'yi bir Dosya Sistemi API'si aracılığıyla ortaya çıkarmak için bazı kodlar yazdım.

Örneğin, verilerin net bir şekilde dışa / içe aktarılması için iyi bir fikirdir.

Oluşturduğum prototip elasticdriver . SİGORTA dayanmaktadır

demo


0

Elasticsearch'e bir json dosyası aktarmak ve bir dizin oluşturmak istiyorsanız, bu Python betiğini kullanın.

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.