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


88

我是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文件?我需要首先采取一些步骤来确保映射正确吗?


Answers:


88

如果要使用带有curl的文件,则正确的命令是这样的:

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

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

如果您想通过命令行与Elasticsearch进行交互,则可能需要看一看弹性外壳,它比curl更为方便。

2019-07-10:请注意,自定义映射类型已弃用,不应使用。我更新了上面url中的类型,以使其更容易看到哪个是索引,哪个是同时具有“ test”名称的类型,这令人困惑。


1
我不为我工作,当我键入“您的命令”时,控制台不提供任何数据。
康拉德

2
@Konrad替换jfblouvmlxecs01localhost,对吗?
Ehtesh Choudhury 2014年

2
clwen-“ @”告诉curl从json文件中加载数据。
奥利弗2014年

1
嗨,我也是弹性搜索的新手,有人可以请我把这些.json文件存储在哪里吗?
swaheed 2014年

2
哪里存储json文件?
AV94 2015年

26

根据当前文档,https//www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

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

例:

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

1
请注意,_bulk load json文件不是有效的json文件;语法在_bulk API链接中提供。另外,您不必提供这些示例中指定的_id;如果省略_id,则会提供自动生成的_id。
史蒂夫·塔佛


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):读取超时(读取超时= 10.0)))
Chiel

除了无法正常工作外,您还在哪里指定URL和端口?
Chiel

您可以访问GitHub页面或运行elasticsearch_loader --help以查看完整的帮助消息。您可以使用--es-host http://hostname:port
MosheZada '18

真好 除了--type在Elasticsearch删除6版中的类型而变得多余时,elastic.co / guide / en / elasticsearch / reference / 6.0 /…
Vlad

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

8

我还没有看到有人提到的一件事: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"}

没有那个,什么都行不通,也不会告诉你为什么


7

我只是确保我和json文件在同一目录中,然后简单地运行它

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

因此,如果您也要确保您位于同一目录中,并以这种方式运行它。注意:命令中的product / default /是我的环境特有的。您可以忽略它或将其替换为与您相关的任何东西。



5

您正在使用

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

如果“ 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文件将无法工作。


1

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

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

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
  • 如果您使用的是弹性搜索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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.