我已经创建了一个我很满意的索引,并且正在尝试在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,查询) );
索引器似乎工作正常,因此此处未包括代码。我已经互换了任何数量的设置参数,所以我知道上面的代码中有一些冗余(或至少默认索引就足够了)。
结果VAR一无所有,尽管我在索引上有大量数据(包括"电影"索引),但在所有属性中都有大脂肪0。
我什至尝试了使用gerager的原始QueryRaw方法和NADA!
编辑(克里斯·普拉特(Chris Pratt)沿着正确的行)
运行:
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
如果我的推断是正确的。
应该发布还是得到?我通常会通过搜索API获得。最后,如果我想对我的本地电影类型写我的疑问,但在某些情况下它将其覆盖URL中的ES-Type怎么办。
例如,如果我注入不同的语言参数并希望现在查询相同的索引,但" en"one_answers" de" es-types等(它们都是与已经通过Sense构建的相同索引下的有效类型)。
预先感谢!
没有什么显而易见的是为什么这对您不起作用。但是,我可以为您提供一些试图解决这个问题的途径。
-
我不熟悉您正在使用的特定DI容器,但是它可能没有正确绑定,从而导致您在创建的实例中实际上未使用某些设置选项。可能是一个漫长的镜头,但我建议您进行挖掘,至少验证您要获得的客户端实例是否应按照应有的方式进行设置。
-
它在某种程度上将问题置于问题,但是Elasticsearch明确建议您不要通过不同类型来处理本地化。您应该使用不同的索引,即
chosen_index_en
,chosen_index_es
等,或使用多场:"title": { "type": "string", "fields": { "en": { "type": "string", "analyzer": "english" }, "es": { "type": "string", "analyzer": "spanish" } }
然后,您可以在
title.en
或title.es
。
上搜索
我看到您正在使用胶片类型的默认映射。也就是说,在索引之前,标准分析仪对数据进行分析。
在查询中,您使用的是术语查询,该查询查找包含 exact term(未分析)的文档(请参见此处)。因此,请小心您的查询是。
尝试使用下面的匹配查询:
var result = _client.Search<film>(s => s
.AllIndices()
.From(0)
.Size(10)
.Query(q => q
.Match(p => p.Title, query)
));
查询现在由标准分析仪在应用之前分析(请参见此处)。