我是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文件?是否需要先采取步骤以确保映射正确?
答案 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命令给它文件位置。
答案 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)