当POSTMAN提交相同的查询时,Elasticsearch的NEST API不会返回查询结果

问题描述 投票:0回答:1

以下代码段是使用NEST API构建的MoreLikeThis查询:

private class Temp
{
     public string Content { get; set; }
     public string TextToSearch { get; set; }
}

var temp = new Temp
{
   TextToSearch = "empire",
};

var response = await model.ElasticClient.SearchAsync<Temp>(s => s
                .Query(q => q
                    .MoreLikeThis(qd => qd
                        .Like(l => l.Text(temp.TextToSearch))
                        .MinTermFrequency(1)
                        .MinDocumentFrequency(1)
                        .Fields(fd => fd.Fields(r => r.Content)))));

执行此代码片段后,response.Documents没有返回任何记录。但是当POSTMAN发布以下JSON有效负载时,会成功收到结果:

{"query":{"more_like_this":{"fields":["content"],"like":["advanced technology"],"min_doc_freq":1,"min_term_freq":1}}}

启用审计跟踪时,此有效负载由上面的C#代码段生成。虽然在两种情况下都能正确传递凭据,但为什么NEST API 6.5.0版不会从弹性搜索实例接收文档?

库中是否有错误或者我们错过了一点?

elasticsearch nest
1个回答
1
投票

除了C#示例中的TextToSearch和JSON查询DSL示例中的"empire"之外,我强烈怀疑这里的问题是在NEST情况下目标的索引和类型的问题。

如果API调用中未提供索引和类型:

对于索引,

  1. 将查看是否有一个默认索引用于在"advanced technology"上配置TempDefaultMappingFor<T>类型
  2. 如果没有ConnectionSettings的默认索引,将使用Temp上配置的DefaultIndex
  3. 如果在ConnectionSettings上没有配置默认索引,则不会进行API调用,并且NEST将抛出异常以指示它没有足够的信息来进行API调用。

对于类型,

  1. 将查看是否有一个默认类型名称用于在ConnectionSettings上配置TempDefaultMappingFor<T>类型
  2. 将查看是否在ConnectionSettings上使用DefaultTypeNameInferrer配置了类型名称约定。如果没有配置,或者它的配置为给定类型返回ConnectionSettingsnull,那么将继续
  3. 将查看是否在""上使用DefaultTypeName指定了默认类型名称。如果未指定,则通过降低类型名称来推断类型名称的POCO类型。对于ConnectionSettings,这将是Temp

因此,假设您已配置默认索引且没有类型名称约定,则NEST示例的请求URI将为

temp

这可能与你在Postman中使用的不匹配。

查看文档以查看有关<configured uri>/<default index>/temp/_search Index name inference的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.