นำเข้า / จัดทำดัชนีไฟล์ JSON ลงใน Elasticsearch


90

ฉันยังใหม่กับ Elasticsearch และได้ป้อนข้อมูลด้วยตนเองจนถึงจุดนี้ ตัวอย่างเช่นฉันได้ทำสิ่งนี้:

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

ตอนนี้ฉันมีไฟล์. json และต้องการสร้างดัชนีลงใน Elasticsearch ฉันได้ลองทำสิ่งนี้เช่นกัน แต่ไม่ประสบความสำเร็จ:

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

ฉันจะนำเข้าไฟล์. json ได้อย่างไร มีขั้นตอนที่ต้องดำเนินการก่อนเพื่อให้แน่ใจว่าการทำแผนที่ถูกต้องหรือไม่


คำตอบ:


89

คำสั่งที่ถูกต้องหากคุณต้องการใช้ไฟล์ที่มี curl คือ:

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

Elasticsearch ไม่มีสคีมาดังนั้นคุณไม่จำเป็นต้องมีการแมป ถ้าคุณส่ง JSON ที่เป็นและคุณใช้การทำแผนที่เริ่มต้นทุกสาขาจะได้รับการจัดทำดัชนีและวิเคราะห์โดยใช้การวิเคราะห์มาตรฐาน

หากคุณต้องการโต้ตอบกับ Elasticsearch ผ่านทางบรรทัดคำสั่งคุณอาจต้องการดูelasticshellซึ่งควรจะสะดวกกว่า curl เล็กน้อย

2019-07-10: ควรสังเกตว่าประเภทการแมปที่กำหนดเองเลิกใช้แล้วและไม่ควรใช้ ฉันอัปเดตประเภทใน url ด้านบนเพื่อให้ง่ายต่อการดูว่าดัชนีใดเป็นดัชนีและประเภทใดเนื่องจากมีชื่อ "test" ทั้งคู่จึงทำให้สับสน


1
ฉันไม่ได้ทำงานให้ฉันเมื่อฉันพิมพ์คำสั่งของคุณคอนโซลจะไม่ให้ข้อมูลใด ๆ
Konrad

2
@Konrad คุณแทนที่jfblouvmlxecs01ด้วยlocalhostใช่ไหม?
Ehtesh Choudhury

2
clwen - ตัว "@" บอกให้ curl โหลดข้อมูลจากไฟล์ json
Oliver

1
สวัสดีฉันยังใหม่ในการค้นหาแบบยืดหยุ่นใครก็ได้ช่วยแนะนำฉันว่าจะเก็บไฟล์. json เหล่านี้ไว้ที่ไหน
swaheed

2
เก็บไฟล์ json ไว้ที่ไหน
AV94

27

ตามเอกสารปัจจุบันhttps://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

หากคุณให้อินพุตไฟล์ข้อความเพื่อ curl คุณต้องใช้แฟล็ก --data-binary แทน -d ธรรมดา หลังไม่รักษาบรรทัดใหม่

ตัวอย่าง:

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

1
โปรดทราบว่าไฟล์ _bulk load json ไม่ใช่ไฟล์ json ที่ถูกต้อง ไวยากรณ์มีให้ในลิงก์ _bulk API นอกจากนี้คุณไม่จำเป็นต้องระบุ _id ตามที่ระบุในตัวอย่างเหล่านี้ จะมี _id ที่สร้างขึ้นโดยอัตโนมัติเมื่อละเว้น _id
Steve Tarver

17

เราสร้างเครื่องมือเล็ก ๆ น้อย ๆ สำหรับสิ่งประเภทนี้https://github.com/taskrabbit/elasticsearch-dump


6
ตัวอย่างที่ให้มาไม่ครอบคลุมคำถามที่ถามที่นี่ จะใช้งานได้หรือไม่ถ้าเราให้ไฟล์ json เป็นอินพุตและ url การค้นหาที่ยืดหยุ่นเป็นเอาต์พุต
jgr0

ฉันใช้สิ่งนี้เพื่อส่งออกดัชนีไปยัง json ขอบคุณ.
Krishna Chaitanya Gopaluni

ใช้คำสั่งต่อไปนี้ elasticdump --input=/path/to/file.json --output=http://'username:password'@localhost:9200/indexname --type=data. ลบ'username:password@'ถ้าคุณไม่ต้องการ
Krishna Chaitanya Gopaluni

11

ฉันเป็นผู้เขียน elasticsearch_loader
ฉันเขียน ESL สำหรับปัญหานี้

คุณสามารถดาวน์โหลดได้ด้วย pip:

pip install elasticsearch-loader

จากนั้นคุณจะสามารถโหลดไฟล์ json ลงใน elasticsearch ได้โดยการออก:

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

นี่คือสิ่งที่ดี! เพิ่มindexบรรทัดบังคับก่อนทุกเอกสาร
dr0i

2018-10-04 11: 51: 40.395741 ความพยายามผิดพลาด [1/1] มีข้อยกเว้นข้อมูลสูญหายถาวรไม่ต้องลองอีกครั้ง 2018-10-04 11: 51: 40.395741 WARN Chunk 0 มีข้อยกเว้น (ConnectionTimeout ที่เกิดจาก - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): อ่านหมดเวลา (read timeout = 10.0))) ในขณะประมวลผล
Chiel

นอกเหนือจากข้อเท็จจริงที่ว่ามันใช้งานไม่ได้คุณระบุ URL และพอร์ตไว้ที่ไหน
ชิเอล

คุณสามารถไปที่หน้า GitHub หรือเรียกใช้elasticsearch_loader --helpเพื่อดูข้อความช่วยเหลือฉบับเต็ม คุณสามารถระบุโฮสต์: port with--es-host http://hostname:port
MosheZada

ดี. ยกเว้นว่า--typeจะซ้ำซ้อนเนื่องจาก Elasticsearch ลบประเภทใน 6 เวอร์ชันelastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.

9

สิ่งหนึ่งที่ฉันไม่เคยเห็นใครพูดถึง: ไฟล์ JSON ต้องมีหนึ่งบรรทัดที่ระบุดัชนีที่บรรทัดถัดไปเป็นของสำหรับทุกบรรทัดของไฟล์ JSON "บริสุทธิ์"

IE

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

หากไม่มีสิ่งนั้นก็ไม่ได้ผลและจะไม่บอกสาเหตุ


8

เพิ่มคำตอบของ KenH

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

คุณสามารถแทนที่@requestsด้วย@complete_path_to_json_file

หมายเหตุ: @มีความสำคัญก่อนพา ธ ไฟล์


คุณช่วยยกตัวอย่างเส้นทางได้ไหม ฉันให้ "@c: \ accounts.json" และวางไว้ที่นั่น แต่ก็ไม่สามารถค้นหาได้
Piyush Mittal

4
ควรจะเป็น @ "c: \ accounts.json"
Ram Pratap

เพิ่มค่าสถานะส่วนหัวเช่น -H "Content-Type: application / json"
Shady Kip

8

ฉันแค่ตรวจสอบให้แน่ใจว่าฉันอยู่ในไดเร็กทอรีเดียวกับไฟล์ json จากนั้นก็เรียกใช้สิ่งนี้

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

ดังนั้นหากคุณแน่ใจว่าคุณอยู่ในไดเร็กทอรีเดียวกันและเรียกใช้ด้วยวิธีนี้ หมายเหตุ: ผลิตภัณฑ์ / ค่าเริ่มต้น / ในคำสั่งเป็นสิ่งที่เฉพาะเจาะจงสำหรับสภาพแวดล้อมของฉัน คุณสามารถละเว้นหรือแทนที่ด้วยสิ่งที่เกี่ยวข้องกับคุณ


6

เพียงแค่รับบุรุษไปรษณีย์จากhttps://www.getpostman.com/docs/environmentให้ตำแหน่งไฟล์ด้วยคำสั่ง / test / test / 1 / _bulk? pretty ป้อนคำอธิบายภาพที่นี่


2
{"error": "ไม่พบตัวจัดการสำหรับ uri [/ test / test / 1 / _bulk? pretty] และ method [POST]"}
Chiel

{"error": "ไม่รองรับส่วนหัวประเภทเนื้อหา [ข้อความ / ธรรมดา]", "status": 406}
X. L

5

คุณกำลังใช้

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

หาก 'request' เป็นไฟล์ json คุณต้องเปลี่ยนเป็นไฟล์

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

ก่อนหน้านี้หากไฟล์ json ของคุณไม่ได้รับการจัดทำดัชนีคุณต้องแทรกบรรทัดดัชนีก่อนแต่ละบรรทัดภายในไฟล์ json คุณสามารถทำได้ด้วย JQ อ้างอิงลิงค์ด้านล่าง: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

ไปที่บทช่วยสอนการค้นหายืดหยุ่น (ตัวอย่างบทช่วยสอนของเช็คสเปียร์) และดาวน์โหลดตัวอย่างไฟล์ json ที่ใช้และดูได้ ด้านหน้าของแต่ละวัตถุ json (แต่ละบรรทัด) มีเส้นดัชนี นี่คือสิ่งที่คุณกำลังมองหาหลังจากใช้คำสั่ง jq รูปแบบนี้จำเป็นต้องใช้ API จำนวนมากไฟล์ json ธรรมดาจะไม่ทำงาน


2

ใน Elasticsearch 7.7 คุณต้องระบุประเภทเนื้อหาด้วย:

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

1
  • หากคุณใช้การค้นหาแบบยืดหยุ่น 7.7 หรือเวอร์ชันที่สูงกว่าให้ปฏิบัติตามคำสั่งด้านล่าง

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

  • ในเส้นทางไฟล์ด้านบนคือ/Users/waseem.khan/waseem/elastic/account.json.

  • หากคุณใช้การค้นหาแบบยืดหยุ่นเวอร์ชัน 6.x คุณสามารถใช้คำสั่งด้านล่าง

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

หมายเหตุ : ตรวจสอบให้แน่ใจว่าในไฟล์. jsonของคุณในตอนท้ายคุณจะเพิ่มบรรทัดว่างหนึ่งบรรทัดไม่เช่นนั้นคุณจะได้รับข้อยกเว้นต่ำกว่า

"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

หากคุณใช้ VirtualBox และ UBUNTU อยู่หรือคุณแค่ใช้ UBUNTU มันจะมีประโยชน์

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 ผ่าน Filesystem API

เป็นความคิดที่ดีสำหรับการส่งออก / นำเข้าข้อมูลอย่างชัดเจน

ฉันสร้างต้นแบบ elasticdriver มันขึ้นอยู่กับFUSE

การสาธิต


0

หากคุณต้องการนำเข้าไฟล์ json ไปยัง Elasticsearch และสร้างดัชนีให้ใช้สคริปต์ Python นี้

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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.