【问题标题】:Nest elastic search.net not returning any results via any query嵌套弹性search.net不通过任何查询返回任何结果
【发布时间】:2015-05-14 22:16:14
【问题描述】:

我已经创建了一个我很满意的索引,并尝试在 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&lt;film&gt;(s =&gt; 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&lt;...&gt;] > base 下)。或者,您可以使用 Glimpse 和 Elasticsearch 插件来查看所有查询。根据生成的查询和您直接从 Elasticsearch 获得的原始结果,您通常可以确定问题所在。
  • 另外,在调试时,检查RequestUrl 的值(在与Request 相同的位置)。如果它在查询错误的索引什么的,你可以从那里立即看到。
  • @ChrisPratt 已回复您的 cmets,请尽可能查看,谢谢!

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


【解决方案1】:

没有什么明显的原因让我觉得这对你不起作用。不过,我可以为您提供一些尝试解决问题的途径。

  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 之类的内容。

【讨论】:

  • 感谢 Chris 的建议,让我改变我的映射结构并回复您 - 希望大家竖起大拇指,非常感谢您!
  • 嗨,克里斯!对垃圾邮件感到抱歉,但请在此处查看映射的后续问题:stackoverflow.com/questions/30354226/…
【解决方案2】:

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

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

尝试使用如下匹配查询:

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

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

【讨论】:

  • 不幸的是,我可能没有使用最好的查询示例,但我确实声明我使用了 queryraw 和其他示例。我觉得问题与我的实际查询无关 - 请查看我的问题编辑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多