假设我们有一个ElasticSearch实例和一个索引。我现在想要在整个索引中搜索包含特定值的文档。它与在多个字段中搜索此查询相关,因此我不想指定要搜索的每个字段。
到目前为止我的尝试(使用NEST)如下:
var res2 = client.Search<ElasticCompanyModelDTO>(s => s.Index("cvr-permanent").AllTypes().
Query(q => q
.Bool(bo => bo
.Must( sh => sh
.Term(c=>c.Value(query))
)
)
));
但是,上面的查询会导致一个空查询:
在我的connectionstring上应用以下调试后,我得到以下输出### ES REQEUST ### {}
:
.DisableDirectStreaming()
.OnRequestCompleted(details =>
{
Debug.WriteLine("### ES REQEUST ###");
if (details.RequestBodyInBytes != null) Debug.WriteLine(Encoding.UTF8.GetString(details.RequestBodyInBytes));
})
.PrettyJson();
我该怎么做呢?为什么我的查询错了?
试试这个
var res2 = client.Search<ElasticCompanyModelDTO>(s =>
s.Index("cvr-permanent").AllTypes()
.Query(qry => qry
.Bool(b => b
.Must(m => m
.QueryString(qs => qs
.DefaultField("_all")
.Query(query))))));
您的问题是您必须指定单个字段作为TermQuery的一部分进行搜索。实际上,所有ElasticSearch查询都需要将一个或多个字段指定为查询的一部分。如果要搜索文档中的每个字段,可以使用内置的“_all”字段(除非您在映射中禁用了它)。
你应该确定你真的想要一个TermQuery,因为它只匹配文本中的完全字符串。查询短的,未分析的字符串字段时通常使用此类查询(例如,包含已知值的枚举的字段,如美国州缩写。)
如果您想查询更长的全文字段,请考虑MultiMatchQuery(它也允许您指定多个字段。)
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html