有没有办法在elasticsearch服务器中导入json文件(包含100个文档).

 陈民翔芷昌柏淑 发布于 2023-02-09 18:01

有没有办法在elasticsearch服务器中导入JSON文件(包含100个文档)?我想将一个大的json文件导入es-server ..

6 个回答
  • Stream2es是IMO最简单的方式.

    例如,假设一个文件"some.json"包含一个JSON文档列表,每行一个:

    curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
    cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type
    

    2023-02-09 18:02 回答
  • 我确定有人想要这个,所以我会很容易找到.

    仅供参考 - 这是在与全新ES实例相同的服务器上使用Node.js(基本上作为批处理脚本).将它放在2个文件中,每个文件包含4000个项目,在我的共享虚拟服务器上只花了大约12秒.因人而异

    var elasticsearch = require('elasticsearch'),
        fs = require('fs'),
        pubs = JSON.parse(fs.readFileSync(__dirname + '/pubs.json')), // name of my first file to parse
        forms = JSON.parse(fs.readFileSync(__dirname + '/forms.json')); // and the second set
    var client = new elasticsearch.Client({  // default is fine for me, change as you see fit
      host: 'localhost:9200',
      log: 'trace'
    });
    
    for (var i = 0; i < pubs.length; i++ ) {
      client.create({
        index: "epubs", // name your index
        type: "pub", // describe the data thats getting created
        id: i, // increment ID every iteration - I already sorted mine but not a requirement
        body: pubs[i] // *** THIS ASSUMES YOUR DATA FILE IS FORMATTED LIKE SO: [{prop: val, prop2: val2}, {prop:...}, {prop:...}] - I converted mine from a CSV so pubs[i] is the current object {prop:..., prop2:...}
      }, function(error, response) {
        if (error) {
          console.error(error);
          return;
        }
        else {
        console.log(response);  //  I don't recommend this but I like having my console flooded with stuff.  It looks cool.  Like I'm compiling a kernel really fast.
        }
      });
    }
    
    for (var a = 0; a < forms.length; a++ ) {  // Same stuff here, just slight changes in type and variables
      client.create({
        index: "epubs",
        type: "form",
        id: a,
        body: forms[a]
      }, function(error, response) {
        if (error) {
          console.error(error);
          return;
        }
        else {
        console.log(response);
        }
      });
    }
    

    希望我能帮助更多,而不仅仅是我自己.不是火箭科学,但可能会节省10分钟.

    干杯

    2023-02-09 18:02 回答
  • 您应该使用批量API.请注意,您需要在每个json文档之前添加标题行.

    $ cat requests
    { "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
    { "field1" : "value1" }
    $ curl -s -XPOST localhost:9200/_bulk --data-binary @requests; echo
    {"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1,"ok":true}}]}
    

    2023-02-09 18:02 回答
  • jq是一个轻量级且灵活的命令行JSON处理器.

    用法:

    cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-

    我们正在使用文件file.json并使用-c标志将其内容管道传输到jq以构造压缩输出.这是块金:我们利用了jq每行输入不仅可以构造一个而且构造多个对象这一事实.对于每一行,我们创建控件JSON Elasticsearch需要(使用我们原始对象的ID)并创建第二行,它只是我们原始的JSON对象(.).

    在这一点上,我们将JSON格式化为Elasticsearch的批量API所期望的方式,因此我们只需将其管道卷曲,将其发送到Elasticsearch!

    归功于Kevin Marsh

    2023-02-09 18:03 回答
  • 导入否,但您可以使用ES API索引文档.

    您可以使用索引api加载每一行(使用某种代码来读取文件并进行curl调用)或索引bulk api来加载它们.假设您的数据文件可以格式化以使用它.

    在这里阅读更多:ES API

    一个简单的shell脚本可以解决这个问题,如果你觉得这样的shell可能(未经测试):

    while read line
    do
    curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
    done <myfile.json
    

    在Peronally,我可能会使用Python pyes或弹性搜索客户端.

    在github 弹性搜索python客户端上的pyes

    Stream2es对于快速将数据加载到es中也非常有用,并且可能有一种方法可以简单地流式传输文件.(我还没有测试过一个文件但是用它来加载维基百科文档以进行es perf测试)

    2023-02-09 18:03 回答
  • 正如dadoonet已经提到的那样,批量API可能就是这样.要转换批量协议的文件,可以使用jq.

    假设文件只包含文件本身:

    $ echo '{"foo":"bar"}{"baz":"qux"}' | 
    jq -c '
    { index: { _index: "myindex", _type: "mytype" } },
    . '
    
    {"index":{"_index":"myindex","_type":"mytype"}}
    {"foo":"bar"}
    {"index":{"_index":"myindex","_type":"mytype"}}
    {"baz":"qux"}
    

    如果文件包含顶级列表中的文档,则必须先将其解包:

    $ echo '[{"foo":"bar"},{"baz":"qux"}]' | 
    jq -c '
    .[] |
    { index: { _index: "myindex", _type: "mytype" } },
    . '
    
    {"index":{"_index":"myindex","_type":"mytype"}}
    {"foo":"bar"}
    {"index":{"_index":"myindex","_type":"mytype"}}
    {"baz":"qux"}
    

    jq的-c标志确保每个文档本身都在一行上.

    如果你想直接卷曲,你会想要使用--data-binary @-,而不仅仅是-d,否则curl将再次剥离换行符.

    2023-02-09 18:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有