将特定类型映射到ElasticSearch索引

时间:2017-11-11 21:24:58

标签: c# elasticsearch nest

我从this学习弹性搜索 很棒的教程。 要创建' nusearch'索引示例代码给出:

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

有一个 .Mappings 部分告诉NEST Package类将存储在&#34; nusearch&#34;指数。 为什么我会得到这样的错误:

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的意义何在?使用它的最佳做法是什么?它在省略时有效,所以我认为在搜索时有意义吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:1)

  

为什么我会这样得到错误:

     

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

     

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

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

  

我想知道为什么有必要添加到ConnectionSettings   再次提供信息,特别是应该存储包类型   索引?

不必针对特定索引映射特定类型,但这样做很常见。如果你决定不这样做,你要么在每个繁琐的请求上明确指定索引,要么使用默认索引,如果你有多个索引,每个索引都有不同的类型,这可能不是你想要做的。

  

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

不,但这是一种选择。

  

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

您可以映射所有类型,或决定不会,这取决于您。我认为定义POCO类型的约定并不那么尴尬 - &gt;在ConnectionSettings上索引一次,而不是在每次请求时提供它。

  

在我看来,CreateIndex方法是提供这类信息的更好地方。

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

  

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

是的,InferMappingFor<T>可以映射

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

.TypeName方法对ElasticSearch的确切含义是什么?使用它的最佳做法是什么?

允许您为POCO指定不同于默认情况下推断的类型名称(下限POCO类型名称)。