c# - 如何将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# 代码中要修改什么。我希望该值能够自行生成,但我被迫更改为字符串。
解决方案
推荐阅读
- wso2is - 登录 Dahsboard 时可以使用密码策略验证器 isconnector 吗?
- r - 需要将 XML 文件中的第一个工作表转换为 data.frame
- wordpress - Wordpress - 如何仅在一个特定菜单上将活动类添加到当前菜单项?
- python - 如何根据值列表的长度对python字典进行排序
- javascript - 与 A/HREF 元素类似,使用 CSS 选择器定位 JavaScript 绑定链接
- javascript - highlightjs 无法与 Showdown 和 AngularJS 一起正常工作
- maven - 无法在 IntelliJ 中使用 Maven 加载 Eclipse 运行时 jar
- python - bigquery.job.ExtractJobConfig()
- c# - C# foreach 的代码优化
- reactjs - Material UI Tab 将道具传递给组件