JSON批量导入Elasticstearch

Bra*_*rad 31 elasticsearch

Elasticsearch批量导入.

我需要将产品作为单个项目导入.

我有一个类似于以下内容的json文件:

{
   "Products":[
      {
         "Title":"Product 1",
         "Description":"Product 1 Description",
         "Size":"Small",
         "Location":[
            {
               "url":"website.com",
               "price":"9.99",
               "anchor":"Prodcut 1"
            }
         ],
         "Images":[
            {
               "url":"product1.jpg"
            }
         ],
         "Slug":"prodcut1"
      },
      {
         "Title":"Product 2",
         "Description":"Prodcut 2 Desctiption",
         "Size":"large",
         "Location":[
            {
               "url":"website2.com",
               "price":"99.94",
               "anchor":"Product 2"
            },
            {
               "url":"website3.com",
               "price":"79.95",
               "anchor":"discount product 2"
            }
         ],
         "Images":[
            {
               "url":"image.jpg"
            },
            {
               "url":"image2.jpg"
            }
         ],
         "Slug":"product2"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我试过以下(我是新手):

curl -s -XPOST 'http://localhost:9200/_bulk' --data-binary @products.json
curl -s -XPOST 'http://localhost:9200/_bulk' -d @products.json
curl -XPOST http://localhost:9200/cp/products -d "@products.json"
curl -XPOST http://localhost:9200/products -d "@products.json"
Run Code Online (Sandbox Code Playgroud)

有些人给出了其他人没有的错误.我需要做什么?

Pai*_*ook 27

遵循批量API文档.您需要使用非常具体格式的文件提供批量操作:

注意:最后一行数据必须以换行符\n结尾.

可能的操作是索引,创建,删除和更新.index和create期望下一行的源,并且具有与标准索引API的op_type参数相同的语义(即,如果已经存在具有相同索引和类型的文档,则create将失败,而index将添加或替换文档有必要的).delete不期望下一行中的源,并且具有与标准删除API相同的语义.update期望在下一行指定部分doc,upsert和script及其选项.

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

因此,您需要将products.json文件的内容更改为以下内容:

 {"index":{"_index":"cp", "_type":"products", "_id": "1"}}
 { "Title":"Product 1", "Description":"Product 1 Description", "Size":"Small", "Location":[{"url":"website.com", "price":"9.99", "anchor":"Prodcut 1"}],"Images":[{ "url":"product1.jpg"}],"Slug":"prodcut1"}
 {"index":{"_index":"cp", "_type":"products", "_id":"2"}}
 {"Title":"Product 2", "Description":"Prodcut 2 Desctiption", "Size":"large","Location":[{"url":"website2.com", "price":"99.94","anchor":"Product 2"},{"url":"website3.com","price":"79.95","anchor":"discount product 2"}],"Images":[{"url":"image.jpg"},{"url":"image2.jpg"}],"Slug":"product2"}
Run Code Online (Sandbox Code Playgroud)

并确保--data-binary在你的curl命令中使用(就像你的第一个命令).另请注意,如果使用索引并键入特定端点index,type则可以省略.你的/cp/products就像你的第三个卷曲命令.

  • `_id`不是必需的.如果省略,Elasticsearch将自动生成一个. (14认同)
  • 另外值得注意的是:端点是`/ _bulk`,`/ {index}/_ bulk`和`{index}/{type}/_ bulk`.当提供`index`或`index/type`时,它们将默认用于未明确提供它们的批量项. (4认同)

nei*_*ilm 7

这很快并且对我在一组 JSON 对象上工作。

cat data.json | \
jq -c '.[]  | .id = ._id | del (._id) | {"index": {"_index": "profiles", "_type": "gps", "_id": .id}}, .' |\
curl  -XPOST 127.0.0.1:9200/_bulk --data-binary @-
Run Code Online (Sandbox Code Playgroud)

我不得不复制和删除该_id字段,因为导入引发了一个错误(字段 [_id] 是一个元数据字段,不能添加到文档中。使用索引 API 请求参数。)如果它没有重命名。大多数数据不太可能有一个_id字段,在这种情况下这部分应该被省略。

这要归功于凯文马什