将JSON文件导入/索引到Elasticsearch中

时间:2013-04-10 21:18:48

标签: json 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文件?是否需要先采取步骤以确保映射正确?

14 个答案:

答案 0 :(得分:76)

如果你想使用curl文件,那么右边的命令就是:

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

Elasticsearch是无模式的,因此您不一定需要映射。如果按原样发送json并使用默认映射,则会使用standard analyzer对每个字段进行索引和分析。

如果您想通过命令行与Elasticsearch进行交互,您可能需要查看elasticshell,这应该比卷曲更容易。

答案 1 :(得分:24)

根据当前的文档,http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

  

如果您要为curl提供文本文件输入,则必须使用   --data-binary标志而不是plain -d。后者不保留换行符。

示例:

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

答案 2 :(得分:12)

我们为这类事物制作了一个小工具https://github.com/taskrabbit/elasticsearch-dump

答案 3 :(得分:7)

加入KenH的回答

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

您可以将@requests替换为@complete_path_to_json_file

注意:@在文件路径

之前很重要

答案 4 :(得分:7)

我确保我与json文件位于同一目录中,然后只需运行此

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

因此,如果你也确保你在同一个目录并以这种方式运行它。 注意:命令中的product / default /是特定于我的环境的。您可以省略它或用与您相关的任何内容替换它。

答案 5 :(得分:6)

https://www.getpostman.com/docs/environments获取邮递员,用/ test / test / 1 / _bulk?pretty命令给它文件位置。 enter image description here

答案 6 :(得分:6)

我是elasticsearch_loader的作者 我为这个确切的问题编写了ESL。

您可以使用pip下载:

pip install elasticsearch-loader

然后你可以通过发出:

将json文件加载到elasticsearch中
elasticsearch_loader --index incidents --type incident json file1.json file2.json

答案 7 :(得分:4)

您正在使用

$ 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文件不起作用。

答案 8 :(得分:3)

我没有看到任何人提到的一件事:JSON文件必须有一行指定下一行所属的索引,对于" pure" JSON文件。

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

没有它,没有任何作用,它不会告诉你为什么

答案 9 :(得分:1)

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

答案 10 :(得分:1)

从Elasticsearch 7.7开始,您还必须指定内容类型:

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

答案 11 :(得分:0)

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

  • 如果您使用的是Elastic Search 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

答案 12 :(得分: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))

答案 13 :(得分:-1)

我编写了一些代码来通过文件系统API公开Elasticsearch API。

例如,明确导出/导入数据是个好主意。

我创建了原型 elasticdriver。它基于FUSE

demo