Elasticsearch批量JSON数据

时间:2017-08-09 22:04:54

标签: json elasticsearch

这个问题来自this SO thread

由于看起来我有一个相似但不相同的查询,最好有一个单独的问题让其他人受益,正如@Val建议的那样。

所以,与上面类似,我需要在索引中插入大量数据(我的初始测试大约是10 000个文档,但这仅适用于POC,还有更多)。我想插入的数据是在.json文档中,看起来像这样(片段):

import { Component, OnInit, Inject, PLATFORM_ID };
import { isPlatformBrowser } from '@angular/common';
....
@Component({
  export class MyComponent implements OnInit {
    constructor(@Inject(PLATFORM_ID) private: platformId: Object){}

    ngOnInit() {
      if(isPlatformBrowser(this.platformId)){
        //do something
      }
    }
  }
)}

我自己承认我是ElasticSearch的新手,但是,通过阅读文档,我的假设是我可以获取.json文件并从其中的数据创建索引。我现在已经了解到,json中的每个项目都需要有一个“标题”,例如:

[ { "fileName": "filename", "data":"massive string text data here" }, 
  { "fileName": "filename2", "data":"massive string text data here" } ]

意思是,这不是实际的json格式(如此),而是操纵字符串。

我想知道是否有一种{"index":{}} { "fileName": "filename", "data":"massive string text data here" } 我的json数据的方式(以json格式),而不必先手动操作文本(因为我的测试数据有10 000个条目,我'我相信你能明白为什么我不想手动这样做。

有任何建议或建议的自动化工具可以帮助解决这个问题吗?

PS - 我正在使用Windows安装程序和Postman进行通话。

2 个答案:

答案 0 :(得分:1)

您可以使用单个shell命令轻松转换文件。如果您的文件名为input.json,则可以执行以下操作:

jq -c -r ".[]" input.json | while read line; do echo '{"index":{}}'; echo $line; done > bulk.json

在此之后,您将拥有一个名为bulk.json的文件,该文件格式正确,可以发送到批量端点。

然后您可以像这样调用批量端点:

curl -XPOST localhost:9200/your_index/your_type/_bulk -H "Content-Type: application/x-ndjson" --data-binary @bulk.json

注意:如果您还没有install jq,则需要先{{3}}。

答案 1 :(得分:0)

这是我将数据批量发送到 es 的代码

    DB::table('order_detail')->insert([
        "ort_ord_id" => $orderId,
        "ort_amount" => $value->price,
        "ort_total" => $value->discounted * $value->quantity,
        "ort_discount" => ($value->price * $value->quantity) - $value->discounted * $value->quantity,
        "ort_type" => "product",
        "ort_number" => $value->quantity,
        "ort_reference_id" => $value->id,
        ( ( ($request->city)=="98" ) ? ($cartPrice>=300000) ? ( ( ($request->province)=="8" ) ? "ort_free_delivery" == "City sending free delivery" ) )
        ( ( ($request->city)!="98" ) ? ($cartPrice>=300000) ? ( ( ($request->province)!="8" ) ? "ort_free_delivery" == "Country sending free delivery" : "ort_free_delivery" == "" ) )
        "created_at" => now(),
        "updated_at" => now()
    ]);

或者你可以使用诸如 elasticdump 或 elasticsearch-tools 之类的库