Nest elastic search.net 未通过任何查询返回任何结果
Nest elastic search.net not returning any results via any query
我已经创建了一个我很满意的索引,并且正在尝试在 NEST 客户端中实现一个类型化查询,如下所示:
var node = new Uri("http://elasticsearch-blablablamrfreeman");
var settings = new ConnectionSettings(node)
.SetTimeout(300000)
.SetDefaultIndex("films")
.MapDefaultTypeIndices(d => d
.Add(typeof(film), "films"))
.SetDefaultPropertyNameInferrer(p=>p);
用我的 DI 注入它(在搜索器和索引器中):
builder.Register(c => new ElasticClient(settings)).Named<ElasticClient>("esclient");
使用任何查询进行搜索,例如:
var result = _client.Search<film>(s => s
.AllIndices()
.从(0)
.尺寸(10)
.Query(q => q
.Term(p => p.Title, 查询)
));
索引器似乎工作正常,因此此处未包含代码。我交换了任意数量的设置参数,所以我知道上面的代码集有一些冗余(或者至少默认索引就足够了)。
尽管我的索引(包括 "films" 索引)中有大量数据,但结果 var 什么都不包含,它的所有属性都有一个大胖子 0。
我什至尝试过使用 matchall 和 nada 的原始 QueryRaw 方法!
编辑(克里斯普拉特在这里是正确的)
运行:
var result = _client.Search<film>(s => s
.From(0)
.Size(10)
.QueryRaw(@"{ ""match_all"": {} }"));
并拥有:
var settings = new ConnectionSettings(node)
.SetTimeout(300000)
.MapDefaultTypeIndices(d => d
.Add(typeof (film), "chosen_index"))
.MapDefaultTypeNames(t => t
.Add(typeof (film), "en"));
Returns 调试信息为:
[Elasticsearch.Net.ElasticsearchResponse<Nest.SearchResponse<film>>] = {StatusCode: 200,
Method: POST,
Url: http://elasticsearch-blablablamrfreeman/chosen_index/film/_search,
Request: {
"from": 0,
"size": 10,
"query": { "match_all": {} }
},
Response: <Response stream not captured or already read...
我的问题是:根据 Chris Pratt 的评论,我似乎实际上查询了错误的 URL,但为什么类型推断不适用于类型,而是适用于索引?
/chosen_index/film/_search
应该阅读
/chosen_index/en/_search
如果我的推断是正确的。
应该POST还是GET?我通常通过搜索 API 获得 GET。最后,如果我想针对我的原生电影类型编写查询,但在某些情况下让它覆盖 URL 中的 ES 类型,该怎么办。
例如,如果我注入不同的语言参数并希望现在查询相同的索引,但是 "en" 和 "de" ES 类型等(它们都是相同索引下的有效类型已经通过 sense 构建)。
提前致谢!
据我所知,您使用的是电影类型的默认映射。也就是说,数据在被索引之前由标准分析器进行分析。
在查询中,您正在使用 Term 查询,该查询查找包含在倒排索引中指定的 exact 术语(未分析)的文档(参见 here) .所以要小心你的 query 是什么。
尝试使用如下匹配查询:
var result = _client.Search<film>(s => s
.AllIndices()
.From(0)
.Size(10)
.Query(q => q
.Match(p => p.Title, query)
));
查询 现在在应用之前由标准分析器进行分析(参见here)。
没有什么明显的问题是为什么这对你不起作用。但是,我可以为您提供一些尝试解决问题的途径。
我不熟悉你正在使用的特定 DI 容器,但它可能没有正确绑定,导致你的一些设置选项实际上没有在创建的实例中使用.可能是一个远景,但我建议深入研究并至少验证您获得的客户端实例是否按照应有的方式设置。
它在某种程度上回避了这个问题,但 Elasticsearch 明确建议您不要通过不同类型处理本地化。您应该使用不同的索引,即 chosen_index_en
、chosen_index_es
等,或者使用 multifields:
"title": {
"type": "string",
"fields": {
"en": {
"type": "string",
"analyzer": "english"
},
"es": {
"type": "string",
"analyzer": "spanish"
}
}
然后您可以搜索 title.en
或 title.es
。
我已经创建了一个我很满意的索引,并且正在尝试在 NEST 客户端中实现一个类型化查询,如下所示:
var node = new Uri("http://elasticsearch-blablablamrfreeman");
var settings = new ConnectionSettings(node) .SetTimeout(300000) .SetDefaultIndex("films") .MapDefaultTypeIndices(d => d .Add(typeof(film), "films")) .SetDefaultPropertyNameInferrer(p=>p);
用我的 DI 注入它(在搜索器和索引器中):
builder.Register(c => new ElasticClient(settings)).Named<ElasticClient>("esclient");
使用任何查询进行搜索,例如:
var result = _client.Search<film>(s => s
.AllIndices() .从(0) .尺寸(10) .Query(q => q .Term(p => p.Title, 查询) ));
索引器似乎工作正常,因此此处未包含代码。我交换了任意数量的设置参数,所以我知道上面的代码集有一些冗余(或者至少默认索引就足够了)。
尽管我的索引(包括 "films" 索引)中有大量数据,但结果 var 什么都不包含,它的所有属性都有一个大胖子 0。
我什至尝试过使用 matchall 和 nada 的原始 QueryRaw 方法!
编辑(克里斯普拉特在这里是正确的)
运行:
var result = _client.Search<film>(s => s
.From(0)
.Size(10)
.QueryRaw(@"{ ""match_all"": {} }"));
并拥有:
var settings = new ConnectionSettings(node)
.SetTimeout(300000)
.MapDefaultTypeIndices(d => d
.Add(typeof (film), "chosen_index"))
.MapDefaultTypeNames(t => t
.Add(typeof (film), "en"));
Returns 调试信息为:
[Elasticsearch.Net.ElasticsearchResponse<Nest.SearchResponse<film>>] = {StatusCode: 200,
Method: POST,
Url: http://elasticsearch-blablablamrfreeman/chosen_index/film/_search,
Request: {
"from": 0,
"size": 10,
"query": { "match_all": {} }
},
Response: <Response stream not captured or already read...
我的问题是:根据 Chris Pratt 的评论,我似乎实际上查询了错误的 URL,但为什么类型推断不适用于类型,而是适用于索引?
/chosen_index/film/_search
应该阅读
/chosen_index/en/_search
如果我的推断是正确的。
应该POST还是GET?我通常通过搜索 API 获得 GET。最后,如果我想针对我的原生电影类型编写查询,但在某些情况下让它覆盖 URL 中的 ES 类型,该怎么办。
例如,如果我注入不同的语言参数并希望现在查询相同的索引,但是 "en" 和 "de" ES 类型等(它们都是相同索引下的有效类型已经通过 sense 构建)。
提前致谢!
据我所知,您使用的是电影类型的默认映射。也就是说,数据在被索引之前由标准分析器进行分析。
在查询中,您正在使用 Term 查询,该查询查找包含在倒排索引中指定的 exact 术语(未分析)的文档(参见 here) .所以要小心你的 query 是什么。
尝试使用如下匹配查询:
var result = _client.Search<film>(s => s
.AllIndices()
.From(0)
.Size(10)
.Query(q => q
.Match(p => p.Title, query)
));
查询 现在在应用之前由标准分析器进行分析(参见here)。
没有什么明显的问题是为什么这对你不起作用。但是,我可以为您提供一些尝试解决问题的途径。
我不熟悉你正在使用的特定 DI 容器,但它可能没有正确绑定,导致你的一些设置选项实际上没有在创建的实例中使用.可能是一个远景,但我建议深入研究并至少验证您获得的客户端实例是否按照应有的方式设置。
它在某种程度上回避了这个问题,但 Elasticsearch 明确建议您不要通过不同类型处理本地化。您应该使用不同的索引,即
chosen_index_en
、chosen_index_es
等,或者使用 multifields:"title": { "type": "string", "fields": { "en": { "type": "string", "analyzer": "english" }, "es": { "type": "string", "analyzer": "spanish" } }
然后您可以搜索
title.en
或title.es
。