Elasticsearch 的 NEST API 没有 return 查询结果而 POSTMAN 提交时相同查询成功

Elasticsearch's NEST API does not return query results while the same query is successful when submitting by POSTMAN

以下代码片段是使用 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 没有 return 任何记录。但是当下面的JSON payload被POSTMANPOST编辑时,结果接收成功:

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

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

库中是否存在错误或我们遗漏了一点?

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

当 API 调用中没有提供索引和类型时:

对于索引,

  1. 将查看是否有默认索引可用于在 ConnectionSettings
  2. 上配置为 DefaultMappingFor<T>Temp 类型
  3. 如果 Temp 没有默认索引,将使用 ConnectionSettings
  4. 上配置的 DefaultIndex
  5. 如果在ConnectionSettings上没有配置默认索引,API调用将不会进行,NEST将抛出一个异常,表明它没有足够的信息来进行[=63] =]打电话。

对于类型,

  1. 将查看是否有默认类型名称用于在 ConnectionSettings
  2. 上使用 DefaultMappingFor<T> 配置的 Temp 类型
  3. 将查看是否在 ConnectionSettings 上使用 DefaultTypeNameInferrer 配置了类型名称约定。如果配置了 none,或者为给定类型配置了 returns null"" 的委托,则将继续
  4. 将查看是否在 ConnectionSettings 上使用 DefaultTypeName 指定了默认类型名称。如果指定 none ,将通过小写类型名称为 POCO 类型推断类型名称。对于 Temp,这将是 temp

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

<configured uri>/<default index>/temp/_search

这可能与您在 Postman 中使用的内容不匹配。

查看文档以了解有关 Index name inference and Type name inference 的更多详细信息。