Nhập / Lập chỉ mục tệp JSON vào Elasticsearch


89

Tôi mới sử dụng Elasticsearch và đã nhập dữ liệu theo cách thủ công cho đến thời điểm này. Ví dụ, tôi đã làm một cái gì đó như thế này:

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

Bây giờ tôi có một tệp .json và tôi muốn lập chỉ mục tệp này vào Elasticsearch. Tôi cũng đã thử một cái gì đó như thế này, nhưng không thành công:

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

Làm cách nào để nhập tệp .json? Có những bước nào tôi cần thực hiện trước để đảm bảo ánh xạ là chính xác không?


Câu trả lời:


88

Lệnh phù hợp nếu bạn muốn sử dụng tệp có curl là:

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

Elasticsearch là không có schemaless, do đó bạn không nhất thiết phải ánh xạ. Nếu bạn gửi json như hiện tại và bạn sử dụng ánh xạ mặc định, mọi trường sẽ được lập chỉ mục và phân tích bằng trình phân tích tiêu chuẩn .

Nếu bạn muốn tương tác với Elasticsearch thông qua dòng lệnh, bạn có thể muốn xem qua lớp vỏ đàn hồi , loại vỏ này sẽ thủ công hơn một chút so với cuộn tròn.

2019-07-10: Cần lưu ý rằng các loại ánh xạ tùy chỉnh không được dùng nữa và không nên sử dụng. Tôi đã cập nhật loại trong url ở trên để giúp dễ dàng xem đâu là chỉ mục và đâu là loại vì cả hai đều có tên là "kiểm tra" gây nhầm lẫn.


1
Tôi không làm việc cho tôi, khi tôi nhập lệnh của Bạn, bảng điều khiển không cung cấp bất kỳ dữ liệu nào.
Konrad

2
@Konrad bạn đã thay thế jfblouvmlxecs01bằng localhost, phải không?
Ehtesh Choudhury

2
clwen - "@" ra lệnh cho curl tải dữ liệu từ tệp json.
Oliver

1
Xin chào, tôi cũng là người mới trong lĩnh vực tìm kiếm đàn hồi, có ai có thể vui lòng cho tôi biết nơi lưu trữ các tệp .json này không?
swaheed

2
Lưu trữ tập tin json ở đâu?
AV94

26

Theo tài liệu hiện tại, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Nếu bạn đang cung cấp đầu vào tệp văn bản để cuộn tròn, bạn phải sử dụng cờ --data-binary thay vì -d thuần túy. Cái sau không bảo toàn dòng mới.

Thí dụ:

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

1
Lưu ý rằng tệp json tải _bulk không phải là tệp json hợp lệ; cú pháp được cung cấp trong liên kết API _bulk. Ngoài ra, bạn không phải cung cấp _id như được chỉ ra trong các ví dụ này; _id được tạo tự động sẽ được cung cấp khi _id bị bỏ qua.
Steve Tarver

16

Chúng tôi đã tạo một công cụ nhỏ cho loại thứ này https://github.com/taskrabbit/elasticsearch-dump


6
Các ví dụ đã cho không bao gồm câu hỏi được hỏi ở đây. Nó sẽ hoạt động nếu chúng tôi cung cấp tệp json làm đầu vào và url tìm kiếm đàn hồi làm đầu ra?
jgr0

11

Tôi là tác giả củaasticsearch_loader,
tôi đã viết ESL cho vấn đề chính xác này.

Bạn có thể tải xuống bằng pip:

pip install elasticsearch-loader

Và sau đó, bạn sẽ có thể tải các tệp json vàoasticsearch bằng cách phát hành:

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

Cái này đẹp đấy! Nó thêm indexdòng bắt buộc trước mỗi tài liệu.
dr0i

2018-10-04 11: 51: 40.395741 LỖI cố gắng [1/1] có ngoại lệ, đó là mất dữ liệu vĩnh viễn, không thể thử lại 2018-10-04 11: 51: 40.395741 CẢNH BÁO Chunk 0 có ngoại lệ (ConnectionTimeout gây ra bởi - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Đã hết thời gian đọc. (Đọc hết thời gian chờ = 10.0))) trong khi xử lý
Chiel

Ngoài thực tế là nó không hoạt động, bạn chỉ định URL và cổng ở đâu?
Chiel

Bạn có thể truy cập trang GitHub hoặc chạy elasticsearch_loader --helpđể xem thông báo trợ giúp đầy đủ. Bạn có thể chỉ định host: port với--es-host http://hostname:port
MosheZada

Đẹp. Ngoại trừ điều đó --typetrở nên thừa vì Elasticsearch loại bỏ các loại trong 6 phiên bảnastic.co/guide/en/elasticsearch/reference/6.0/
Vlad T.

8

Thêm vào câu trả lời của KenH

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

Bạn có thể thay thế @requestsbằng@complete_path_to_json_file

Lưu ý: @rất quan trọng trước đường dẫn tệp


u có thể đưa ra một số ví dụ cho đường dẫn. tôi đang đưa ra "@c: \ accounts.json" và đặt nó ở đó thậm chí sau đó, nó không thể xác định nó
Piyush Mittal

4
nó phải được @ "c: \ accounts.json"
Ram Pratap

8

Một điều mà tôi chưa thấy ai đề cập: tệp JSON phải có một dòng chỉ định chỉ mục mà dòng tiếp theo thuộc về, cho mọi dòng của tệp JSON "thuần túy".

I E

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

Không có điều đó, không có gì hoạt động và nó sẽ không cho bạn biết tại sao


7

Tôi chỉ đảm bảo rằng tôi đang ở trong cùng một thư mục với tệp json và sau đó chỉ cần chạy nó

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

Vì vậy, nếu bạn cũng đảm bảo rằng bạn đang ở cùng một thư mục và chạy nó theo cách này. Lưu ý: product / default / trong lệnh là một cái gì đó cụ thể cho môi trường của tôi. bạn có thể bỏ qua hoặc thay thế nó bằng bất cứ thứ gì có liên quan đến bạn.


6

chỉ cần yêu cầu người đưa thư từ https://www.getpostman.com/docs/en canh cung cấp cho nó vị trí tệp bằng lệnh / test / test / 1 / _bulk? pretty. nhập mô tả hình ảnh ở đây


2
{"error": "không tìm thấy trình xử lý nào cho uri [/ test / test / 1 / _bulk? pretty] và phương pháp [POST]"}
Chiel

{"error": "Tiêu đề Loại-Nội dung [văn bản / trơn] không được hỗ trợ", "trạng thái": 406}
X.

5

Bạn đang sử dụng

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

Nếu 'yêu cầu' là tệp json thì bạn phải thay đổi tệp này thành

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

Trước đó, nếu tệp json của bạn không được lập chỉ mục, bạn phải chèn một dòng chỉ mục trước mỗi dòng bên trong tệp json. Bạn có thể làm điều này với JQ. Tham khảo link bên dưới: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Đi tới hướng dẫn tìm kiếm đàn hồi (ví dụ hướng dẫn shakespeare) và tải xuống mẫu tệp json được sử dụng và xem nó. Ở phía trước của mỗi đối tượng json (mỗi dòng riêng lẻ) có một dòng chỉ mục. Đây là những gì bạn đang tìm kiếm sau khi sử dụng lệnh jq. Định dạng này là bắt buộc để sử dụng API hàng loạt, các tệp json thuần túy sẽ không hoạt động.


1

Kể từ Elasticsearch 7.7, bạn cũng phải chỉ định loại nội dung:

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

0

nếu bạn đang sử dụng VirtualBox và UBUNTU trong đó hoặc đơn giản là bạn đang sử dụng UBUNTU thì nó có thể hữu ích

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

Tôi đã viết một số mã để hiển thị API Elasticsearch thông qua API hệ thống tệp.

Ví dụ, bạn nên xuất / nhập dữ liệu một cách rõ ràng.

Tôi tạo ra nguyên mẫu elasticdriver . Nó dựa trên FUSE

bản giới thiệu


0
  • Nếu bạn đang sử dụng tìm kiếm đàn hồi phiên bản 7.7 trở lên thì hãy làm theo lệnh dưới đây.

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

  • Trên đường dẫn tệp trên là /Users/waseem.khan/waseem/elastic/account.json.

  • Nếu bạn đang sử dụng phiên bản tìm kiếm đàn hồi 6.x thì bạn có thể sử dụng lệnh dưới đây.

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

Lưu ý : Đảm bảo rằng trong tệp .json của bạn ở cuối, bạn sẽ thêm một dòng trống nếu không bạn sẽ nhận được ngoại lệ bên dưới.

"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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.