没有指定字段的简单查询在整个 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