嵌套:构建带有“必须”和“应该”约束的 QueryContainer 请求

Viv*_*ipo 3 elasticsearch nest

我尝试构建一个具有必须和应该请求的elasticsearch请求,我的目标请求如下:

POST /index/type/_search
{
  "query": {
    "bool" : {
      "must" : {
         "match":{"field1":{"query":"word1"}}
      },
      "should":{
        "match":{"field2":{"query":"word2"}}
      }
    }
  }}
Run Code Online (Sandbox Code Playgroud)

我写:

 var queryContainer = new QueryContainer();
 queryContainer &= new MatchQuery() { Field = "field1", Query = "word1" };
 queryContainer |= new MatchQuery() { Field = "field2", Query = "word2"};


var searchRequest = new SearchRequest<type>
        {
            Query = queryContainer
        };
Run Code Online (Sandbox Code Playgroud)

但它产生了我:

POST /index/type/_search
{
  "query":{
    "bool":{
      "should":[
        {"match":{"field1":{"query":"word1"}}},
        {"match":{"field2":{"query":"word2"}}}]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你知道构建 QueryContainer 时应该写什么吗?

Rus*_*Cam 5

在这里使用运算符重载并没有多大帮助;我认为在这种情况下,构建bool查询更清晰

对象初始化语法

var searchRequest = new SearchRequest<Document>()
{
    Query = new BoolQuery
    {
        Must = new QueryContainer[] { new MatchQuery() { Field = "field1", Query = "word1" } },
        Should = new QueryContainer[] { new MatchQuery() { Field = "field2", Query = "word2" } }
    }
};

client.Search<Document>(searchRequest);
Run Code Online (Sandbox Code Playgroud)

或流畅的API

client.Search<Document>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(fi => fi
                .Match(m => m
                      .Field("field2")
                      .Query("word2")
                )
            )
            .Should(sh => sh
                .Match(m => m
                      .Field("field1")
                      .Query("word1")
                )
            )
        )
    )
);
Run Code Online (Sandbox Code Playgroud)