Nest elastic search.net不会通过任何查询返回任何结果

时间:2015-05-12 15:56:40

标签: asp.net asp.net-mvc nest elasticsearch-net

我已经创建了一个我感到满意的索引,并尝试在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()     。从(0)     .Size(10)     .Query(q =&gt; q     .Term(p =&gt; p.Title,查询)     ));

  4. 索引器似乎工作正常所以代码不包括在这里。我已交换了任意数量的设置参数,因此我知道上面的代码集中存在一些冗余(或者至少默认索引已经足够)。

    结果var包含任何内容,尽管我的索引中包含大量数据(包括&#34;电影&#34;索引),但它的所有属性都有大胖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类型,该怎么办?

    例如,如果我注入一个不同的语言参数,并希望现在查询相同的索引,但两个&#34; en&#34;和&#34; de&#34; ES类型等(它们都是通过sense构建的相同索引下的所有有效类型)。

    提前致谢!

2 个答案:

答案 0 :(得分:0)

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

在查询中,您使用的是Term查询,该查询查找包含反向索引中指定的完全项(未分析)的文档(请参阅here)。所以要小心你的查询

尝试使用如下匹配查询:

Tracker.autorun(function(){
  var length = Session.get("length");
  console.log("length new value =", length);
});

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

答案 1 :(得分:0)

为什么这不适合你,没有什么明显的东西可以跳出来。但是,我可以为您提供一些尝试解决问题的途径。

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

  2. 它在某种程度上解决了问题,但Elasticsearch明确建议您不要通过不同类型处理本地化。您应该使用不同的索引,即chosen_index_enchosen_index_es等,或使用multifields

    "title": {
        "type": "string",
        "fields": {
            "en": {
                "type": "string",
                "analyzer": "english"
            },
            "es": {
                "type": "string",
                "analyzer": "spanish"
            }
        }
    

    然后,您可以搜索title.entitle.es等内容。