我已经创建了一个我很满意的索引,并试图在 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() .From(0) .Size(10) .Query(q => q .Term(p => p.Title, query) ));
索引器似乎工作正常,因此此处未包含代码。我已经交换了任意数量的设置参数,所以我知道上面设置的代码中有一些冗余(或者至少默认索引就足够了)。
结果变量不包含任何内容,尽管我的索引(包括“电影”索引)中有大量数据,但它的所有属性都为 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 构造了)。
提前致谢!