【问题标题】:Mapping particular type to ElasticSearch index将特定类型映射到 ElasticSearch 索引
【发布时间】:2017-11-11 21:24:57
【问题描述】:

我正在从 this 学习弹性搜索 很棒的教程。 给出了创建“nusearch”索引的示例代码:

        Client.CreateIndex("nusearch", i => i
            .Settings(s => s
                .NumberOfShards(2)
                .NumberOfReplicas(0)
                .Analysis(Analysis)
            )
            .Mappings(m => m
                .Map<Package>(MapPackage)
            )
        );

有一个 .Mappings 部分告诉 NEST 包类将存储在“nusearch”索引中。 为什么会出现这样的错误:

Index name is null for the given type and no default index is set. Map an index name using ConnectionSettings.MapDefaultTypeIndices() or set a default index using ConnectionSettings.DefaultIndex().'

当试图以这种方式索引包时?:

        foreach (Package pack in packages)
        {
            Client.Index<Package>(pack);
        }

ConnectionSettings 配置简化为:

        _connectionSettings = new ConnectionSettings(CreateUri(9200));

我想知道为什么需要再次向 ConnectionSettings 添加 Package 类型应该存储在特定索引中的信息? 是否有必要在 ConnectionSettings 中映射特定的 POCO? 如果应用程序很大并且您有很多类型要映射怎么办?那不是很尴尬吗? 在我看来, CreateIndex 方法是提供此类信息的更好地方。

我已经检查过这样的代码是否可行:

                    _connectionSettings = new ConnectionSettings(CreateUri(9200))
                        .MapDefaultTypeIndices(m => m.Add(typeof(Package), "nusearch"))

或:

                .InferMappingFor<Package>(i => i
                .TypeName("package")
                .IndexName("nusearch"))
            )

方法 InferMappingFor 是 MapDefaultTypeIndices 的扩展版本?

如果您能另外告诉我:.TypeName 方法对于 ElasticSearch 究竟意味着什么?使用它的最佳做法是什么?它在省略时有效,所以我认为在搜索时有意义?

感谢您提前回复。

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    为什么会出现这样的错误:

    给定类型的索引名称为空,并且未设置默认索引。地图 使用 ConnectionSettings.MapDefaultTypeIndices() 或设置的索引名称 使用 ConnectionSettings.DefaultIndex() 的默认索引。'

    何时尝试以这种方式索引包?

    错误信息告诉你原因;请求没有索引名称。必须向 Elasticsearch 提供索引名称,以便它知道在哪个索引中索引文档。 NEST is able to infer an index name from a number of different places in order of precedence,因此必须至少设置其中一项。

    我想知道为什么需要添加到 ConnectionSettings 再次说明应特别存储包类型的信息 索引?

    不必将特定类型映射到特定索引,但这样做很常见。如果您决定不这样做,那么您可以在每个请求上显式指定索引,这很麻烦,或者您使用默认索引,如果您有多个索引,每个索引都具有不同的类型,这可能不是您想要做的。

    是否需要在 ConnectionSettings 中映射特定的 POCO?

    不,但这是一种选择。

    如果应用程序很大并且要映射的类型很多怎么办?是不是很尴尬?

    您可以映射所有类型,或者决定不映射,这取决于您。我会说在 ConnectionSettings 上定义 POCO 类型的约定 -> 索引一次比在每个请求上都需要提供它更尴尬。

    在我看来,CreateIndex 方法更适合提供此类信息。

    我不同意;客户端的每次使用都可能不会创建索引(它们可能已经存在,甚至可能由另一个进程创建),因此将约定设置与单例配置选项联系起来是有意义的,这就是 ConnectionSettings 是什么以及它们应该如何使用.

    方法 InferMappingFor 是 MapDefaultTypeIndices 的扩展版本?

    可以,InferMappingFor&lt;T&gt;可以映射

    • 索引名称
    • 类型名称
    • 应用于_id 的 POCO 属性
    • 要忽略的属性
    • 属性映射到 Elasticsearch 中的字段名称(如果不同于简单地将 POCO 属性名称进行驼峰化的默认约定)。

    .TypeName 方法对 ElasticSearch 究竟意味着什么?使用它的最佳做法是什么?

    允许您为 POCO 指定不同于默认推断的类型名称(小写 POCO 类型名称)。

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 2015-11-03
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2016-03-31
      • 1970-01-01
      相关资源
      最近更新 更多