gpt4 book ai didi

c# - Elasticsearch 嵌套 : Create an index through ElasticClient by specifying json

转载 作者:太空狗 更新时间:2023-10-29 22:30:47 24 4
gpt4 key购买 nike

我们允许客户在创建索引时定义自定义分析器。我们更愿意在 json 中指定它,以通过底层 ElasticSearch 文档提供最大的灵 active 和可理解性。

我想使用在 json 字符串中定义的分析器、映射器等的任意描述来创建索引。使用sense,我的命令是

PUT /my_index
{
"settings":
{
"analysis":
{
"char_filter" :
{
"my_mapping" :
{
"type" : "mapping",
"mappings" : [".=>,", "'=>,"]
}
},
"analyzer":
{
"my_analyzer":
{
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase" ],
"char_filter" : ["my_mapping"]
}
}
}
}
}
}

理想情况下,我的代码应该是这样的

string json = RetrieveJson();
ElasticSearchClient client = InitializeClient();
client.CreateIndexUsingJson( json ); // this is the syntax I can't figure out

帖子here尝试通过实例化 IndexSettings 然后调用 Add( "analysis", json ) 来执行此操作,但 Add 不是我正在使用的 ElasticSearch 库版本上的函数。

我能想到的选项包括:

  1. 以某种方式使用 ElasticClient.Raw.IndicesCreatePost 或类似的东西
  2. 通过 IndexSettingsConverter.ReadJson() 将 json 字符串反序列化为 IndexSettings 对象,然后通过 ElasticClient.CreateIndex(ICreateIndexRequest) 应用它

这两种机制的文档都很少。

我绝对想避免使用 CreateIndex 的 lambda 函数版本,因为将用户的 json 转换为 lamdba 表达式会很痛苦,只是立即将它们转换回 NEST 深处的 json。

非常感谢上面#1 或#2 的其他选项或具体示例,这是解决此问题的推荐方法。

最佳答案

最简单的解决方案是实现原始问题中的选项 #1。

public void CreateIndex(string indexName, string json)
{
ElasticClient client = GetClient();
var response = _client.Raw.IndicesCreatePost(indexName, json);
if (!response.Success || response.HttpStatusCode != 200)
{
throw new ElasticsearchServerException(response.ServerError);
}
}

在修改转换器和 JsonReaders 以及 JsonSerializers 之后,我发现 IndexSettingsConverter 似乎没有将任意设置 json 正确反序列化为有效的 IndexSettings 对象。感觉到一个兔子洞,我采纳了 Manolis 的建议并想出了如何将任意 json 直接应用于 ElasticClient.IElasticsearchClient 以避免必须对安全性和连接细节进行逆向工程。

要得出这个结论需要付出艰苦的努力,如果不研究大量未记录的 NEST 代码,这是完全不可能的。

关于c# - Elasticsearch 嵌套 : Create an index through ElasticClient by specifying json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29026007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com