【问题标题】:Elasticsearch Bulk Index JSON DataElasticsearch 批量索引 JSON 数据
【发布时间】:2016-01-25 05:19:48
【问题描述】:

我正在尝试将 JSON 文件批量索引到新的 Elasticsearch 索引中,但我无法这样做。我在 JSON 中有以下示例数据

[{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"},
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"},
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"},
{"Amount": "2115", "Quantity": "2", "Id": "975463798", "Client_Store_sk": "1109"},
{"Amount": "2116", "Quantity": "1", "Id": "975463827", "Client_Store_sk": "1109"},
{"Amount": "648", "Quantity": "3", "Id": "975464139", "Client_Store_sk": "1109"},
{"Amount": "2126", "Quantity": "2", "Id": "975464805", "Client_Store_sk": "1109"},
{"Amount": "2133", "Quantity": "1", "Id": "975464061", "Client_Store_sk": "1109"},
{"Amount": "1339", "Quantity": "4", "Id": "974919458", "Client_Store_sk": "1109"},
{"Amount": "1196", "Quantity": "5", "Id": "974920538", "Client_Store_sk": "1109"},
{"Amount": "1198", "Quantity": "4", "Id": "975463638", "Client_Store_sk": "1109"},
{"Amount": "1345", "Quantity": "4", "Id": "974919522", "Client_Store_sk": "1109"},
{"Amount": "1347", "Quantity": "2", "Id": "974919563", "Client_Store_sk": "1109"},
{"Amount": "673", "Quantity": "2", "Id": "975464359", "Client_Store_sk": "1109"},
{"Amount": "2153", "Quantity": "1", "Id": "975464511", "Client_Store_sk": "1109"},
{"Amount": "3896", "Quantity": "4", "Id": "977289342", "Client_Store_sk": "1109"},
{"Amount": "3897", "Quantity": "4", "Id": "974920602", "Client_Store_sk": "1109"}]

我正在使用

 curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary --data @/home/data1.json 

当我尝试使用 Elasticsearch 中的标准批量索引 API 时,出现此错误

 error: {"message":"ActionRequestValidationException[Validation Failed: 1: no requests added;]"}

任何人都可以帮助索引这种类型的 JSON 吗?

【问题讨论】:

  • 你能告诉我你正在使用的索引请求吗
  • @KumarKailash 这里是请求 curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary --data @/home/data1.json

标签: json elasticsearch


【解决方案1】:

您需要做的是读取该 JSON 文件,然后使用_bulk endpoint 预期的格式构建一个批量请求,即一行用于命令,一行用于文档,用换行符分隔。 . 冲洗并重复每个文档:

curl -XPOST localhost:9200/your_index/_bulk -d '
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463711"}}
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463943"}}
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}
... etc for all your documents
'

只需确保将 your_indexyour_type 替换为您正在使用的实际索引和类型名称。

更新

请注意,如果您的 URL 中指定了 _index_type,则可以通过删除它们来缩短命令行。如果您在映射中指定path to your id field,也可以删除_id(但请注意,此功能将在 ES 2.0 中弃用)。至少,您的命令行对于所有文档可能看起来像 {"index":{}},但它始终是强制性的,以便指定您要执行哪种操作(在本例中为 index 文档)

更新 2

curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary  @/home/data1.json

/home/data1.json 应如下所示:

{"index":{}}
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}
{"index":{}}
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}
{"index":{}}
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"}

更新 3

UPDATE 2中提到的如何生成新的json样式文件可以参考this answer

更新 4

从 ES 7.x 开始,doc_type 不再是必需的,应该只是 _doc 而不是 my_doc_type。从 ES 8.x 开始,文档类型将被完全删除。你可以阅读更多关于这个here

【讨论】:

  • 命令行对于每个文档始终是强制性的。如果您在 URL 中添加索引和类型名称(即 localhost:9200/your_index/your_type/_bulk),您可以从命令行中删除 _index_type 以缩短它。还有一种方法不必指定_id,但至少,您始终需要指定要对文档执行的操作,即您可以做的最短操作是{"index":{}}
  • 您不需要在数组中指定 JSON 对象(即[...])并且文档之间没有逗号,每行只需一个 JSON,每行末尾有换行符(不要'不要忘记最后一行之后的换行符)。我已经用你的最新代码更新了我的答案。
  • @Val 我是正确的,然后我说你不能简单地传入一个 .json 对象,并且它需要首先被解析/转换(即它自己的行上的每个项目和添加的 index每个项目的标题?如果是这样,是否有一个已知的工具可以用来自动执行此操作?我问因为我有一个包含 10 000 个项目的 json 文件,我认为我可以传递整个文档,但是,我很快就被纠正了。
  • @Hexie 在你的情况下,你可以使用上面的 UPDATE 2 和一个 shell 脚本来更新你的文件并添加标题行。
  • @Val Fair 建议 - 创建新问题:stackoverflow.com/questions/45601344/…
【解决方案2】:

截至今天,6.1.2 是 ElasticSearch 的最新版本,适用于我在 Windows (x64) 上的 curl 命令是

curl -s -XPOST localhost:9200/my_index/my_index_type/_bulk -H "Content-Type: 
application/x-ndjson" --data-binary @D:\data\mydata.json

mydata.json 中应该存在的数据格式与@val 的回答中显示的相同

【讨论】:

【解决方案3】:

有效的 Elasticsearch 批量 API 请求类似于(以换行符结尾):

发布http://localhost:9200/products_slo_development_temp_2/productModel/_bulk

{ "index":{ } } 
{"RequestedCountry":"slo","Id":1860,"Title":"Stol"} 
{ "index":{ } } 
{"RequestedCountry":"slo","Id":1860,"Title":"Miza"} 

Elasticsearch 批量 API 文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html

我就是这样做的

我发送一个 POST http 请求,其中 uri 变量作为 http 请求的 URI/URL,elasticsearchJson 变量是在为 Elasticsearch 批量 api 格式化的 http 请求正文中发送的 JSON:

var uri = @"/" + indexName + "/productModel/_bulk";
var json = JsonConvert.SerializeObject(sqlResult);
var elasticsearchJson = GetElasticsearchBulkJsonFromJson(json, "RequestedCountry");

为 Elasticsearch 批量 api 生成所需 json 格式的辅助方法:

public string GetElasticsearchBulkJsonFromJson(string jsonStringWithArrayOfObjects, string firstParameterNameOfObjectInJsonStringArrayOfObjects)
{
  return @"{ ""index"":{ } } 
" + jsonStringWithArrayOfObjects.Substring(1, jsonStringWithArrayOfObjects.Length - 2).Replace(@",{""" + firstParameterNameOfObjectInJsonStringArrayOfObjects + @"""", @" 
{ ""index"":{ } } 
{""" + firstParameterNameOfObjectInJsonStringArrayOfObjects + @"""") + @"
";
}

我的 JSON 对象中的第一个属性/字段是 RequestedCountry 属性,这就是我在此示例中使用它的原因。

productModel 是我的 Elasticsearch 文档类型。 sqlResult 是一个包含产品的 C# 通用列表。

【讨论】:

    【解决方案4】:

    此答案适用于 Elastic Search 7.x 及更高版本。 _type 已弃用。正如其他人所提到的,您可以以编程方式读取文件,并构造如下所述的请求正文。另外,我看到您的每个 json 对象都具有 Id 属性。因此,您可以将文档的内部 id (_id) 设置为与此属性相同。更新后的_bulk API 如下所示:

    HTTP 方法:POST

    URI:/<index_name>/_bulk

    请求正文(应以新行结尾):

    {"index":{"_id": "975463711"}}
    {"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}
    {"index":{"_id": "975463943"}}
    {"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}
    

    【讨论】:

      猜你喜欢
      • 2016-04-16
      • 2018-01-17
      • 2017-11-25
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多