首页 > 解决方案 > 如何将json数据插入elasticsearch .net

问题描述

我想用 c# 编写与下面的 Python 代码相同的代码。但我不知道在 c# 代码中要修改什么。我希望结果保持不变,但我别无选择,只能将其更改为字符串。

我实际要插入的 json 数据比 me.json 文件更复杂、更庞大。

me.json 在此处输入图像描述

蟒蛇代码

import json
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

ES_ENDPOINT = "http://아이디:비밀번호@ip주소:9200"
es = Elasticsearch(ES_ENDPOINT, timeout=300, max_retries=10, retry_on_timeout=True)

def gendata():


    file = open('me.json')
    jsonString = json.load(file)


    keys = [
        key for key in jsonString
    ]
    print(keys)


    x = range(len(keys))


    for i in x:

        jsonArray = jsonString.get(keys[i])

        # print(jsonArray)

        for list in jsonArray:
            yield {
                "_index": "jsoninsert100",
                "_source": {
                    keys[i] : list
                }
            }

        # print(list)

        i = i + 1

bulk(es, gendata())

gendata()

python 结果屏幕 在此处输入图像描述

c#(.net) 代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Elasticsearch.Net;
using Nest;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace jsonParsing
{
    class Program
    {
        public class IotDatabase
        {
            public string K { get; set; }
            public string V { get; set; }
        }


        static void Main(string[] args)
        {

            // 엘라스틱서치 연동
            var defaultIndex = "jsoninsert5";
            var pool = new SingleNodeConnectionPool(new Uri("http://아이디:비밀번호@ip주소:9200"));
            var settings = new ConnectionSettings(pool)
                .DefaultIndex(defaultIndex);
            var client = new ElasticClient(settings);


            // json 파싱

            String path = @"C:\me.json";

            JObject obj = JObject.Parse(File.ReadAllText(path));


            IList<string> keys = obj.Properties().Select(p => p.Name).ToList();

            // 키 추출
            List<string> key_list = new List<string>();

            var z = keys.Count();



            var list5 = new List<IotDatabase>();

            for (var i = 0; i < z; i++)
            {

                string k = keys[i];

                JToken v = (JToken)obj[keys[i]];

                JArray v1 = (JArray)v;

                var count = v1.Count();


                foreach (var list in v1)
                {
                    //Console.WriteLine(list);
                    var iotDatabase = new IotDatabase { K = k, V = list.ToString() };

                    list5.Add(iotDatabase);
                }
            }


            // bulk 삽입
            var bulkAllObservable = client.BulkAll(list5, b => b
                .Index("jsoninsert101")
                .BackOffTime("30s") // 재시도 간의 대기시간
                .BackOffRetries(2)
                .Size(100000) // 대량 요청 당 항목?
            )
            .Wait(TimeSpan.FromMinutes(15), next =>
            {
            });

            Console.ReadLine();

        }
    }
}

c#结果屏幕 在此处输入图像描述

我想用 c# 编写与下面的 Python 代码相同的代码。但我不知道在我的 c# 代码中要修改什么。我希望该值能够自行生成,但我被迫更改为字符串。

标签: c#json.netelasticsearchbulk

解决方案


推荐阅读