엘라스틱서치에 json 데이터를 삽입하려고하는데 문제가 있어 질문드립니다.
저는 아래의 python으로 작성된 코드와 동일한 c# 코드를 작성하려고합니다.
하지만 c#에서는 결과 사진과 같이 value의 자료형을 string으로 선언하였기 때문에
줄바꿈 문자가 포함되어 저장이 됩니다. 줄바꿈 문자가 포함되지 않도록하려면 어떻게해야하나요?
me.json 파일은 임시로 사용중인 파일이고 실제로 넣으려는 데이터는 굉장히 방대하고 복잡합니다.
python 코드입니다.
import json
import time
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
ES_ENDPOINT = "http://id:password@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))
start = time.time()
i = 0
for i in x:
jsonArray = jsonString.get(keys[i])
for list in jsonArray:
yield {
"_index": "jsoninsert_python2",
"_source": {
keys[i] : list
}
}
i = i + 1
print("시간: {}초".format(time.time() - start))
bulk(es, gendata())
gendata()
실행 결과 사진입니다.
c# 코드입니다.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Elasticsearch.Net;
using Nest;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace jsonParsing
{
class Program
{
public class IotDatabase
{
public string siteID { get; set; }
public string bimID { get; set; }
public string K { get; set; }
public string V { get; set; }
}
static void Main(string[] args)
{
// 엘라스틱서치 연동
var defaultIndex = "jsoninsert_c4";
var pool = new SingleNodeConnectionPool(new Uri("http://id:password@ip주소:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(settings);
// json 파싱
String path = @"C:\Users\me.json";
JObject obj = JObject.Parse(File.ReadAllText(path));
// list 선언
var list = new List<IotDatabase>();
// 키 추출
IList<string> keys = obj.Properties().Select(p => p.Name).ToList();
var c = keys.Count();
for (var i = 0; i < c; i++)
{
string k = keys[i];
JToken v = (JToken)obj[keys[i]];
JArray v1 = (JArray)v;
foreach (var x in v1)
{
var iotDatabase = new IotDatabase {
//siteID = "DTAAS",
//bimID = "TestBIM",
K = k,
V = x.ToString()
};
list.Add(iotDatabase);
}
}
// bulk 삽입
var bulkAllObservable = client.BulkAll(list, b => b
.Index("jsoninsert_c4")
.BackOffTime("30s") // 재시도 간의 대기시간
.BackOffRetries(2)
.Size(100000) // 대량 요청 당 항목?
)
.Wait(TimeSpan.FromMinutes(15), next =>
{
});
Console.ReadLine();
}
}
}
실행 결과 사진입니다.
me.json 파일입니다.
{
"test1": [
{
"id": 1,
"x": 1,
"y": 1
},
{
"id": 3,
"x": 3,
"y": 3
}
],
"test2": [
{
"id": 2,
"x": 2,
"y": 2
}
]
}