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

Sha*_*ler 79 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"
}'
Run Code Online (Sandbox Code Playgroud)

我现在有一个.json文件,我想把它编入Elasticsearch.我也尝试过类似的东西,但没有成功:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json
Run Code Online (Sandbox Code Playgroud)

如何导入.json文件?是否需要先采取步骤以确保映射正确?

jav*_*nna 79

如果你想使用curl文件,正确的命令是这样的:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/_doc/1' -d @lane.json
Run Code Online (Sandbox Code Playgroud)

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

如果您想通过命令行与Elasticsearch进行交互,您可能需要查看一下应该比curl 更有用的弹壳.

  • @Konrad,您将`jfblouvmlxecs01`替换为`localhost`,对吗? (2认同)
  • clwen - "@"告诉curl从json文件加载数据. (2认同)
  • 哪里存储json文件? (2认同)

小智 25

根据当前的文档,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
Run Code Online (Sandbox Code Playgroud)


Eva*_*van 14

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

  • 给出的例子不包括这里提出的问题.如果我们将json文件作为输入并将弹性搜索URL作为输出,它会工作吗? (6认同)

Mos*_*ada 10

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

您可以通过pip下载它:

pip install elasticsearch-loader
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过发出以下命令将json文件加载到elasticsearch中:

elasticsearch_loader --index incidents --type incident json file1.json file2.json
Run Code Online (Sandbox Code Playgroud)


Ram*_*tap 8

加入KenH的答案

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Run Code Online (Sandbox Code Playgroud)

您可以替换@requests使用@complete_path_to_json_file

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

  • 它应该是@"c:\ accounts.json" (4认同)

Gaj*_*mbi 7

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

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json
Run Code Online (Sandbox Code Playgroud)

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


Piy*_*tal 6

https://www.getpostman.com/docs/environments获取邮递员,用/ test/test/1/_bulk?pretty命令给它文件位置. 在此输入图像描述

  • { "error": "没有找到 uri [/test/test/1/_bulk?pretty] 和方法 [POST] 的处理程序" } (2认同)

Gre*_*rty 6

我还没有看到有人提到的一件事: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"}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您正在使用

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Run Code Online (Sandbox Code Playgroud)

如果“ requests”是一个json文件,则必须将其更改为

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json
Run Code Online (Sandbox Code Playgroud)

现在在此之前,如果您的json文件未建立索引,则必须在json文件中的每一行之前插入一个索引行。您可以使用JQ做到这一点。请参考以下链接:http : //kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

转到elasticsearch教程(莎士比亚教程示例)并下载使用的json文件示例并进行查看。在每个json对象(每行)的前面都有一个索引行。这是使用jq命令后要寻找的东西。要使用批量API,此格式是强制性的,纯json文件将无法使用。