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 调用中没有提供索引和类型时:
对于索引,
- 将查看是否有默认索引可用于在
ConnectionSettings
上配置为 DefaultMappingFor<T>
的 Temp
类型
- 如果
Temp
没有默认索引,将使用 ConnectionSettings
上配置的 DefaultIndex
- 如果在
ConnectionSettings
上没有配置默认索引,API调用将不会进行,NEST将抛出一个异常,表明它没有足够的信息来进行[=63] =]打电话。
对于类型,
- 将查看是否有默认类型名称用于在
ConnectionSettings
上使用 DefaultMappingFor<T>
配置的 Temp
类型
- 将查看是否在
ConnectionSettings
上使用 DefaultTypeNameInferrer
配置了类型名称约定。如果配置了 none,或者为给定类型配置了 returns null
或 ""
的委托,则将继续
- 将查看是否在
ConnectionSettings
上使用 DefaultTypeName
指定了默认类型名称。如果指定 none ,将通过小写类型名称为 POCO 类型推断类型名称。对于 Temp
,这将是 temp
。
因此,假设您配置了默认索引并且没有类型名称约定,那么您的 NEST 示例的请求 URI 将为
<configured uri>/<default index>/temp/_search
这可能与您在 Postman 中使用的内容不匹配。
查看文档以了解有关 Index name inference and Type name inference 的更多详细信息。
以下代码片段是使用 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 调用中没有提供索引和类型时:
对于索引,
- 将查看是否有默认索引可用于在
ConnectionSettings
上配置为 - 如果
Temp
没有默认索引,将使用ConnectionSettings
上配置的 - 如果在
ConnectionSettings
上没有配置默认索引,API调用将不会进行,NEST将抛出一个异常,表明它没有足够的信息来进行[=63] =]打电话。
DefaultMappingFor<T>
的 Temp
类型
DefaultIndex
对于类型,
- 将查看是否有默认类型名称用于在
ConnectionSettings
上使用 - 将查看是否在
ConnectionSettings
上使用DefaultTypeNameInferrer
配置了类型名称约定。如果配置了 none,或者为给定类型配置了 returnsnull
或""
的委托,则将继续 - 将查看是否在
ConnectionSettings
上使用DefaultTypeName
指定了默认类型名称。如果指定 none ,将通过小写类型名称为 POCO 类型推断类型名称。对于Temp
,这将是temp
。
DefaultMappingFor<T>
配置的 Temp
类型
因此,假设您配置了默认索引并且没有类型名称约定,那么您的 NEST 示例的请求 URI 将为
<configured uri>/<default index>/temp/_search
这可能与您在 Postman 中使用的内容不匹配。
查看文档以了解有关 Index name inference and Type name inference 的更多详细信息。