【问题标题】:Simple query without a specified field searching in whole ElasticSearch index在整个 ElasticSearch 索引中搜索没有指定字段的简单查询
【发布时间】:2018-08-18 22:13:25
【问题描述】:

假设我们有一个 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();

我该怎么做?为什么我的查询有误?

【问题讨论】:

    标签: elasticsearch nest elasticsearch-dsl


    【解决方案1】:

    您的问题是您必须指定单个字段作为 TermQuery 的一部分进行搜索。事实上,所有 ElasticSearch 查询都需要将一个或多个字段指定为查询的一部分。如果您想搜索文档中的每个字段,可以使用内置的“_all”字段(除非您在映射中禁用了它。)

    您应该确定自己也确实需要一个 TermQuery,因为它只会匹配文本中的精确字符串。这种类型的查询通常用于查询短的、未分析的字符串字段(例如,包含已知值枚举的字段,如美国州缩写)。

    如果您想查询更长的全文字段,请考虑使用 MultiMatchQuery(它也可以让您指定多个字段。)

    https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

    【讨论】:

    • ElasticSearch 6.0 中删除了 _all 字段。 ElasticOn 有一个非常好的视频,删除 _all 开始于 07:30 左右。
    【解决方案2】:

    试试这个

    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))))));
    

    【讨论】:

    • 您能否向 OP 解释在此处使用 query_string 查询和在原始问题中使用 term 查询之间的区别是什么?我认为这将有助于更好地解释您的答案:)
    • Term 查询允许您一次搜索特定字段以获得完全匹配,而 query_string 查询允许您对提供的字段使用匹配查询(_all 是可用字段的组合)。这听起来足够接近@RussCam 吗? :)
    【解决方案3】:

    现有答案依赖于 _all 的存在。万一以后有人遇到这个问题,值得知道 _all 在 ElasticSearch 6.0 中已被删除

    有一个非常好的视频解释了这背后的原因以及替换工作的方式,从大约 07:30 开始,ElasticOn 开始。

    简而言之,_all 查询可以替换为 simple_query_string,并且它的工作方式相同。 _search API 的形式是;

    GET <index>/_search
    {
      "query": {
        "simple_query_string" : {
            "query": "<queryTerm>"
        }
      }
    }
    

    Elastic 文档中有关此查询的 NEST 页面是 here

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2015-03-08
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      相关资源
      最近更新 更多