以下代码段是使用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版不会从弹性搜索实例接收文档?
库中是否有错误或者我们错过了一点?
除了C#示例中的TextToSearch
和JSON查询DSL示例中的"empire"
之外,我强烈怀疑这里的问题是在NEST情况下目标的索引和类型的问题。
如果API调用中未提供索引和类型:
对于索引,
"advanced technology"
上配置Temp
的DefaultMappingFor<T>
类型ConnectionSettings
的默认索引,将使用Temp
上配置的DefaultIndex
ConnectionSettings
上没有配置默认索引,则不会进行API调用,并且NEST将抛出异常以指示它没有足够的信息来进行API调用。对于类型,
ConnectionSettings
上配置Temp
的DefaultMappingFor<T>
类型ConnectionSettings
上使用DefaultTypeNameInferrer
配置了类型名称约定。如果没有配置,或者它的配置为给定类型返回ConnectionSettings
或null
,那么将继续""
上使用DefaultTypeName
指定了默认类型名称。如果未指定,则通过降低类型名称来推断类型名称的POCO类型。对于ConnectionSettings
,这将是Temp
。因此,假设您已配置默认索引且没有类型名称约定,则NEST示例的请求URI将为
temp
这可能与你在Postman中使用的不匹配。
查看文档以查看有关<configured uri>/<default index>/temp/_search
和Index name inference的更多详细信息。