代码之家  ›  专栏  ›  技术社区  ›  Lars Holdgaard

在整个ElasticSearch索引中无指定字段搜索的简单查询

  •  2
  • Lars Holdgaard  · 技术社区  · 6 年前

    假设我们有一个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 ### {} ,在我的connectionstring上应用以下调试后:

    .DisableDirectStreaming()
    .OnRequestCompleted(details =>
    {
         Debug.WriteLine("### ES REQEUST ###");
         if (details.RequestBodyInBytes != null) Debug.WriteLine(Encoding.UTF8.GetString(details.RequestBodyInBytes));
                })
     .PrettyJson();
    

    我该怎么做?为什么我的问题是错误的?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Nathan Adams    6 年前

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

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

    如果您想查询更长的全文字段,请考虑MultiMatchQuery(它还允许您指定多个字段)

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

        2
  •  2
  •   sramalingam24    6 年前

    试试这个

    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))))));
    
        3
  •  0
  •   Jontia Rob Prouse    4 年前

    现有答案依赖于\u all的存在。如果以后有人遇到这个问题,那么有必要知道在ElasticSearch 6.0中删除了\u all

    有一段很好的视频解释了这背后的原因以及替换的工作方式 ElasticOn 07:30左右开始。

    简而言之,可以用一个简单的\u query\u字符串替换\u all查询,并且它将以相同的方式工作。搜索API的格式为:;

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

    此查询的Elastic文档上的嵌套页为 here ;