【发布时间】:2015-05-14 22:16:14
【问题描述】:
我已经创建了一个我很满意的索引,并尝试在 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) .查询(q => q .Term(p => p.Title, 查询) ));
索引器似乎工作正常,因此此处未包含代码。我已经交换了任意数量的设置参数,所以我知道上面设置的代码中有一些冗余(或者至少默认索引就足够了)。
结果变量不包含任何内容,尽管我的索引(包括“电影”索引)拥有丰富的数据,但它的所有属性都为 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"));
返回调试信息为:
[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 获取。最后,如果我想针对我的原生电影类型编写查询,但在某些情况下让它覆盖 URL 中的 ES 类型,该怎么办。
例如,如果我注入不同的语言参数并希望现在查询相同的索引,但同时查询“en”和“de”ES 类型等(它们都是在同一个索引下的所有有效类型,已通过 sense 构造)。
提前致谢!
【问题讨论】:
-
在这些场景中帮助我的是获取 NEST 正在生成的实际查询并直接针对您的索引运行该查询。要获得查询,您可以在结果对象上调试和检查
ConnectionStatus.Request(它稍微隐藏在[Nest.SearchResponse<...>]>base下)。或者,您可以使用 Glimpse 和 Elasticsearch 插件来查看所有查询。根据生成的查询和您直接从 Elasticsearch 获得的原始结果,您通常可以确定问题所在。 -
另外,在调试时,检查
RequestUrl的值(在与Request相同的位置)。如果它在查询错误的索引什么的,你可以从那里立即看到。 -
@ChrisPratt 已回复您的 cmets,请尽可能查看,谢谢!
标签: asp.net asp.net-mvc nest elasticsearch-net