96

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

4

14 回答 14

95

如果您想使用带有 curl 的文件,正确的命令是:

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

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

如果你想通过命令行与 Elasticsearch 交互,你可能想看看应该比 curl 更方便一点的 elasticshell

2019-07-10:应注意自定义映射类型已弃用且不应使用。我更新了上面 url 中的类型,以便更容易看出哪个是索引,哪个是类型,因为两者都命名为“test”是令人困惑的。

于 2013-04-10T21:37:45.420 回答
27

根据当前文档,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
于 2014-11-13T00:36:25.770 回答
18

我们为这种类型的东西制作了一个小工具https://github.com/taskrabbit/elasticsearch-dump

于 2014-11-18T03:32:50.510 回答
16

我没有看到任何人提到的一件事:对于“纯” 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"}

没有它,什么都行不通,它不会告诉你为什么

于 2017-05-01T14:40:08.310 回答
13

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

您可以使用 pip 下载它:

pip install elasticsearch-loader

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

elasticsearch_loader --index incidents --type incident json file1.json file2.json
于 2018-03-16T20:29:06.660 回答
10

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

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

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

于 2018-05-05T11:42:32.487 回答
8

添加到KenH的答案

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

您可以替换@requests@complete_path_to_json_file

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

于 2016-05-18T15:51:12.443 回答
6

只需从https://www.getpostman.com/docs/environments获取邮递员,使用 /test/test/1/_bulk?pretty 命令为其提供文件位置。 在此处输入图像描述

于 2016-10-12T04:35:40.153 回答
6

您正在使用

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

于 2017-06-14T05:33:27.853 回答
3

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

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>
于 2020-06-08T09:19:37.860 回答
1

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

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

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

演示

于 2018-12-14T09:11:43.563 回答
1
  • 如果您使用的是弹性搜索 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
于 2020-10-01T13:07:55.107 回答
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
于 2014-02-24T10:35:14.020 回答
-1

如果要将 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))
于 2020-12-09T08:56:52.593 回答