簡體   English   中英

將 JSON 文件導入/索引到 Elasticsearch

[英]Import/Index a JSON file into Elasticsearch

我是 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 文件? 我需要先采取哪些步驟來確保映射正確嗎?

如果要使用帶有 curl 的文件,正確的命令是:

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

Elasticsearch 是無模式的,因此您不一定需要映射。 如果您按原樣發送 json 並使用默認映射,則每個字段都將使用標准分析器進行索引和分析。

如果你想通過命令行與 Elasticsearch 交互,你可能想看看elasticshell ,它應該比 curl 更方便一些。

2019-07-10:需要注意的是,自定義映射類型已被棄用,不應使用。 我更新了上面 url 中的類型,以便更容易地看到哪個是索引,哪個是類型,因為同時命名為“test”是令人困惑的。

根據當前文檔, 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

我們為這類事情做了一個小工具https://github.com/taskrabbit/elasticsearch-dump

我沒有看到任何人提到的一件事:對於“純”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"}

沒有它,什么都不起作用,它也不會告訴你為什么

我是 elasticsearch_loader 的作者
我為這個確切的問題寫了 ESL。

你可以用pip下載它:

pip install elasticsearch-loader

然后您將能夠通過發出以下命令將 json 文件加載到 elasticsearch 中:

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

我只是確保我與 json 文件在同一目錄中,然后簡單地運行它

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

所以如果你也確保你在同一個目錄下並以這種方式運行它。 注意:命令中的 product/default/ 特定於我的環境。 您可以省略它或用與您相關的任何內容替換它。

添加到 KenH 的答案

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

您可以用@requests替換@complete_path_to_json_file

注意: @在文件路徑之前很重要

只需從https://www.getpostman.com/docs/environments獲取郵遞員,使用 /test/test/1/_bulk?pretty 命令為其指定文件位置。 在此處輸入圖片說明

您正在使用

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

如果“請求”是一個 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

轉到 elasticsearch 教程(例如莎士比亞教程)並下載使用的 json 文件示例並查看它。 在每個 json 對象(每個單獨的行)前面都有一個索引行。 這就是您在使用 jq 命令后要查找的內容。 這種格式是使用批量 API 所必需的,普通的 json 文件不起作用。

從 Elasticsearch 7.7 開始,您還必須指定內容類型:

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

我編寫了一些代碼來通過文件系統 API 公開 Elasticsearch API。

例如,清楚地導出/導入數據是個好主意。

我創建了原型elasticdriver 它基於FUSE

演示

  • 如果您使用的是彈性搜索 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

如果您在其中使用 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

如果要將 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))

謝謝你的出色工作! 這么多有用的提示...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM