将特定类型映射到ElasticSearch索引

安杰伊

我正在从这个很棒的教程中学习Elasticsearch 创建“ nusearch”索引的示例代码如下:

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

有一个.Mappings部分,它告诉NEST Package类将存储在“ 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().'

尝试以这种方式对Package编制索引时:

        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到底意味着什么?什么是使用它的最佳实践?它在省略时有效,所以我认为搜索时有意义吗?

感谢您的提前答复。

拉斯·卡姆

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

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

尝试以这种方式对Package编制索引时?

错误消息告诉您原因;没有该请求的索引名。必须向Elasticsearch提供索引名称,以便它可以知道在哪个索引中对文档建立索引。NEST能够根据优先级从多个不同的位置推断出索引名称,因此必须设置其中至少一个。

我想知道为什么必须再次向ConnectionSettings添加信息,即Package类型应该存储在特定索引中?

不必针对特定的索引映射特定的类型,但是这样做很普遍。如果您决定不这样做,则可以在每个请求上明确指定索引,这很麻烦,或者您使用默认索引,如果您有多个索引且每个索引都具有不同的类型,则可能不需要这样做。

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

不,但这是一个选择。

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

您可以映射所有类型,也可以决定不映射,这取决于您。我想说,在ConnectionSettings上一次定义POCO类型的约定->索引要比在每个请求中都提供它要方便得多。

在我看来,CreateIndex方法是提供此类信息的更好位置。

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

方法InferMappingFor是MapDefaultTypeIndices的扩展版本吗?

是的,InferMappingFor<T>可以地图

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

.TypeName方法对ElasticSearch到底意味着什么?什么是使用它的最佳实践?

允许您为POCO指定与默认情况下不同的类型名称(小写的POCO类型名称)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章