1

我已经创建了一个我很满意的索引,并试图在 NEST 客户端中实现一个类型化的查询,如下所示:

  1. 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);
    
  2. 用我的 DI 注入它(在搜索器和索引器中):

    builder.Register(c => new ElasticClient(settings)).Named<ElasticClient>("esclient");
    
  3. 使用任何查询进行搜索,如下所示:

    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 构造了)。

提前致谢!

4

2 回答 2

0

如我所见,您正在使用电影类型的默认映射。也就是说,数据在被索引之前由标准分析器分析。

在查询中,您正在使用 Term 查询查找包含倒排索引中指定的确切术语(未分析)的文档(请参见此处)。所以要小心你的查询是什么。

尝试使用如下匹配查询:

var result = _client.Search<film>(s => s
    .AllIndices()
    .From(0)
    .Size(10)
    .Query(q => q
    .Match(p => p.Title, query)
));

现在,该查询在应用之前由标准分析器进行分析(请参见此处)。

于 2015-05-12T19:58:58.230 回答
0

为什么这对你不起作用,没有什么明显的事情会引起我的注意。但是,我可以为您提供一些尝试解决问题的途径。

  1. 我不熟悉您正在使用的特定 DI 容器,但它可能没有正确绑定,导致您的某些设置选项实际上没有在创建的实例中使用。可能是一个长镜头,但我建议深入研究并至少验证您获得的客户端实例是否按照应有的方式设置。

  2. 它在某种程度上回避了这个问题,但 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

于 2015-05-14T14:16:14.733 回答