如何在NEST 2.3.0中使用bool查询和must子句和filter子句

时间:2016-04-28 06:23:43

标签: elasticsearch nest

文档说过滤查询是

  

在2.0.0-beta1中弃用。请使用bool查询而不是必须   查询的子句和过滤器的过滤子句。

source

这是否正确使用了filter子句?

var result = client.Search<Post>(x => x
.Query(q => q
    .Bool(b => b
        .Must(m => m
            .MultiMatch(mp => mp
                .Query(query)
                .Fields(f => f
                    .Fields(f1 => f1.Title, f2 => f2.Body, f3 => f3.Tags))))
        .Filter(f => f
            .Bool(b1 => b1
                .Must(filters)))))); // or filter?

查询是string,过滤器是Func<QueryContainerDescriptor<Post>, QueryContainer>[]

原始JSON请求是:

"query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "javascript",
            "fields": [ "title", "body", "tags" ]
          }
        }
      ],
      "filter": [
        {
          "bool": {
            "must": [
              { "term": { "tags": { "value": "javascript" } } },
              { "term": { "tags": { "value": "ajax" } } },
              { "term": { "tags": { "value": "jquery" } } }
            ]
          }
        }
      ]
    }

1 个答案:

答案 0 :(得分:1)

您将使用filtered查询查询,现在您将使用bool查询must子句,同样,您将使用{{ {1}}查询过滤器,您现在将使用filtered查询bool子句。

在您的情况下,您必须满足多个filter子句,因此在传递给外部bool filter子句的must查询中包装为一组bool子句是正确的。

在Elasticsearch 2.0中,queries and filters merged into one,具有查询上下文和过滤器上下文的概念;当包含在filter查询bool子句中时,查询/过滤器位于过滤器上下文中,因此不会计算相关性分数,并且它将是可缓存的。

NEST 2.x与Elasticsearch 2.0中的更改保持一致,并具有可在查询和过滤器上下文中使用的查询(filterQueryContainer等)。