ElasticSearch - NEST - 如何结合 AND 和 OR 语句

Sam*_*ukh 2 elasticsearch nest

我是 ElasticSearch - NEST API 的新手。

我们正在尝试使用 AND/OR 子句准备多个条件。例如 - (条件 1 OR 条件 2) AND (条件 3)

目前我们正在尝试通过连接查询条件。

任何人都可以使用 NEST API 提供更好的示例吗?

Uts*_*awn 5

ElasticSearch 中有一个叫做Bool Query的东西。匹配与其他查询的布尔组合(AND、OR、NOT)匹配的文档的查询。它是使用一个或多个布尔子句构建的,每个子句都有一个类型化的出现。发生类型有:

must:(AND)子句(查询)必须出现在匹配的文档中。

应该:(或)子句(查询)应该出现在匹配的文档中。在没有 must 子句的布尔查询中,一个或多个 should 子句必须匹配一个文档。可以使用 minimum_should_match 参数设置要匹配的最少数量的 should 子句。

must_not: (NOT) 子句(查询)不得出现在匹配文档中。

因此,对于您给出的示例,您将获得以下查询:

bool 
    should
        condition 1
        condition 2
    bool
        must
            condition 3
Run Code Online (Sandbox Code Playgroud)

在 ElasticSearch 中,代码如下所示:

"filter": {
           "bool": {
               "should": [
                             {"term": {"tag": value1}},
                             {"term": {"tag": value2}}
                         ],
                         "bool": {
                                 "must":{"term": {"tag": "value3"}}
                                 }
                    }
           }
Run Code Online (Sandbox Code Playgroud)

在 NEST 中,它看起来像:

Filter(f=>f
   .Bool(b=>b
       .Should(
          o=>o.Term(t=>t.Tag, Value1),
          o=>o.Term(t=>t.Tag, Value2)),
          o=>o.Bool(bo=>bo
            .Must(a=>a.Term(t=>t.Tag, Value3))
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

根据NEST 文档,您可以使用 NEST 的 Bitwise 运算符,而不是编写如此繁琐和冗长的查询,这很简单。

.Query((q=>q.Term(tag, value1) || q.Term(tag, value2)) && q.Term(tag, value3))
Run Code Online (Sandbox Code Playgroud)