Elasticsearch集群嵌套搜索时的小写文档类型
Lowercase Document Type during Nest search of Elasticsearch cluster
我正在搜索使用 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 搜索时,使用大写发票时我得到了正确的结果,但使用小写发票时没有结果。
知道这里会发生什么吗?
NEST 的 default inference for a type name 来自 T
类型的 POCO,是将 typeof(T).Name
值小写。您可以轻松地为 T
或 ConnectionSettings
上的所有 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文档。
我正在搜索使用 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 搜索时,使用大写发票时我得到了正确的结果,但使用小写发票时没有结果。
知道这里会发生什么吗?
NEST 的 default inference for a type name 来自 T
类型的 POCO,是将 typeof(T).Name
值小写。您可以轻松地为 T
或 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文档。