在整个ElasticSearch索引

时间:2018-03-10 12:21:21

标签: elasticsearch nest elasticsearch-dsl

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

我该怎么做?为什么我的查询错了?

3 个答案:

答案 0 :(得分: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))))));

答案 1 :(得分:2)

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

你应该确定你真的想要一个TermQuery,因为那只会匹配文本中的完全字符串。查询短的,未分析的字符串字段时通常使用此类查询(例如,包含已知值的枚举的字段,如美国州缩写。)

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

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

答案 2 :(得分:0)

现有答案取决于_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;