当前位置: 首页 > 面试题库 >

ElasticSearch NEST:通过指定json通过ElasticClient创建索引

裘光启
2023-03-14
问题内容

我们允许客户在创建索引时定义自定义分析器。我们希望在json中指定此名称,以通过基础的ElasticSearch文档提供最大的灵活性和可理解性。

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

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

这里的帖子试图通过实例化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的建议,并弄清楚了如何直接对ElasticClient.IElasticsearchClient应用任意json以避免对安全性和连接细节进行逆向工程。

做出这个结论是费力的,而且如果不处理大量未记录的NEST代码,这是完全不可能的。



 类似资料:
  • 问题内容: Java中是否有一种方法,只需指定开始索引和结束索引,即可将对象列表从Arraylist获取到另一个ArrayList? 问题答案: 是的,您可以使用以下方法: 这将返回原始列表那部分的视图,它不会复制数据。 如果要复制:

  • 本文向大家介绍Jquery通过JSON字符串创建JSON对象,包括了Jquery通过JSON字符串创建JSON对象的使用技巧和注意事项,需要的朋友参考一下 PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用: 在线JSON代码检验、检验、美化、格式化工具: http://tools.jb51.net/code/json JSON在线格式化工具: http://to

  • 问题内容: 在python中使用MySQLdb库时,如何定义多语句函数或过程? 例: 这将创建以下回溯: 如果我将相同的SQL直接复制到mysql shell客户端中,它将按预期工作 问题答案: 该命令是内置的MySQL Shell客户端,只有该程序(和MySQL查询浏览器)才能识别。如果您直接通过API执行SQL语句,则无需使用。 的目的是帮助您避免在语句本身可以包含分号字符时避免终止语句。这在

  • 我的Spring启动应用程序正在使用CouchBase5.1社区。 我的应用程序需要一个主要索引和几个次要索引。 我正在寻找一种通过代码自动完成的方法,所以当应用程序启动时,它将检查索引是否丢失,并在需要时创建它们。 有没有办法通过Spring数据或Couchbase客户机来实现?

  • 问题内容: 假设此JSON对象: 可以像这样检索“ set2”属性: 有没有一种方法可以通过索引检索“ set2”属性?它是JSON对象的第二个属性。这是行不通的(当然): 因此,假设我要检索JSON对象的第二个属性,但我不知道它的名称-那么我该怎么做? 更新: 是的,我知道对象是无序属性的集合。但是我不认为浏览器会干扰JSON文字/字符串定义的“原始”顺序。 问题答案: JavaScript中的

  • 问题内容: 从git存储库安装时,如何通过pip安装extras_requires? 我知道当项目在pypi上时您可以执行。 而且您必须要做一个git repo,但是我没有找到如何将这两个选项链接在一起的方法。 问题答案: 按示例#6应该可以正常工作 对于远程回购: 这是本地的(感谢@ Kurt-Bourbaki):