Elasticsearch群集的Nest搜索期间的小写文档类型

时间:2018-08-16 21:46:42

标签: elasticsearch nest

我正在搜索使用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类型,例如发票。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

NEST的default inference for a type name来自类型T的POCO,用于小写typeof(T).Name的值。您可以轻松更改TConnectionSettings上所有POCO的行为

对于所有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。