没有指定字段的简单查询在整个 ElasticSearch 索引中搜索
Simple query without a specified field searching in whole ElasticSearch index
假设我们有一个 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))
)
)
));
但是,上面的查询结果为空查询:
在我的连接字符串上应用以下调试后,我得到以下输出 ### 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 查询都需要将一个或多个字段指定为查询的一部分。如果您想搜索文档中的每个字段,可以使用 built-in“_all”字段(除非您在映射中禁用了它。)
您应该确定您确实也需要 TermQuery,因为它只会匹配文本中的精确字符串。这种类型的查询通常用于查询简短的、未分析的字符串字段(例如,包含美国各州缩写等已知值枚举的字段。)
如果您想查询更长的 full-text 字段,请考虑使用 MultiMatchQuery(它也允许您指定多个字段。)
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
现有答案依赖于 _all 的存在。万一以后有人遇到这个问题,值得一提的是 _all 在 ElasticSearch 6.0
中被删除了
有一个非常好的视频解释了这背后的原因以及从 ElasticOn 大约 07:30 开始的替换工作方式。
简而言之,_all 查询可以用 simple_query_string 代替,它的工作方式相同。 _search API 的形式为;
GET <index>/_search
{
"query": {
"simple_query_string" : {
"query": "<queryTerm>"
}
}
}
Elastic 文档中针对此查询的 NEST 页面是 here;
假设我们有一个 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))
)
)
));
但是,上面的查询结果为空查询:
在我的连接字符串上应用以下调试后,我得到以下输出 ### 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 查询都需要将一个或多个字段指定为查询的一部分。如果您想搜索文档中的每个字段,可以使用 built-in“_all”字段(除非您在映射中禁用了它。)
您应该确定您确实也需要 TermQuery,因为它只会匹配文本中的精确字符串。这种类型的查询通常用于查询简短的、未分析的字符串字段(例如,包含美国各州缩写等已知值枚举的字段。)
如果您想查询更长的 full-text 字段,请考虑使用 MultiMatchQuery(它也允许您指定多个字段。)
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
现有答案依赖于 _all 的存在。万一以后有人遇到这个问题,值得一提的是 _all 在 ElasticSearch 6.0
中被删除了有一个非常好的视频解释了这背后的原因以及从 ElasticOn 大约 07:30 开始的替换工作方式。
简而言之,_all 查询可以用 simple_query_string 代替,它的工作方式相同。 _search API 的形式为;
GET <index>/_search
{
"query": {
"simple_query_string" : {
"query": "<queryTerm>"
}
}
}
Elastic 文档中针对此查询的 NEST 页面是 here;