0

我正在搜索使用 AWS 托管解决方案托管的 v5.5 elasticsearch 集群。我正在使用客户端向集群发送搜索请求,但没有找到任何命中。我打开了集群杠杆日志,可以看到问题是正在搜索的类型是小写的(当索引中的文档类型是大写时),因此它无法匹配任何文档。

我将一个搜索描述符对象传递给 Nest 客户端:

GetSearchDescriptor(SearchDescriptor<T> descriptor)
{
      descriptor.Index(index)
                    .Type(documentType)
                    .Query(q => (q
                                .Bool(bq => bq
                                 ...

}

client.Search<T>(s => GetSearchDescriptor(s))

其中 documentType 是 T 类型,例如 Invoice。

当我查看 CloudWatch 日志时,我可以看到到达集群的请求是小写的发票(而不是大写的发票)。这与文档类型不匹配,因此不显示任何结果。当我使用日志中的确切 json 进行 kibana 搜索时,我在使用大写 Invoice 时得到正确的结果,但在使用小写 Invoice 时没有结果。

有什么想法可以在这里发生吗?

4

1 回答 1

1

NEST从 type 的 POCO 中对类型名称的默认推断T是将值小写typeof(T).NameT您可以轻松地为所有 POCO更改此行为ConnectionSettings

对于所有 POCO

var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .DefaultTypeNameInferrer(type => type.Name.ToUpperInvariant());

var client = new ElasticClient(settings);

仅用于T例如Invoice

var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .InferMappingFor<Invoice>(m => m
        .TypeName("INVOICE")
    );

var client = new ElasticClient(settings);

对于后者,您还可以使用InferMappingFor<T>为 指定默认索引名称T,并告诉客户端应该使用哪个属性来推断文档的 id。

于 2018-08-16T23:20:35.983 回答