多个 should 查询与 must 查询

Multiple should queries with must query

我正在构建对 Elastic 5 的查询(使用 .net 中的嵌套),我正在尝试实现此结果:

必须有值 1 和值 2

应该有值 3 或值 4

并且应该有 value5 或 value6

这是我的查询:

    {
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "code": {
              "query": "value1"
            }
          }
        },
        {
          "match": {
            "code": {
              "query": "value2"
            }
          }
        }
      ],
      "should": [
        {
          "match": {
            "code": {
              "query": "value3"
            }
          }
        },
        {
          "match": {
            "code": {
              "query": "value4"
            }
          }
        }
        ],
        "should": [
        {
          "match": {
            "code": {
              "query": "value5"
            }
          }
        },
        {
          "match": {
            "code": {
              "query": "value6"
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

我没有得到想要的答案(例如我没有任何值 5 和值 6 但仍然得到结果)

谢谢

那么你需要这样的东西:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "code": {
              "query": "value1"
            }
          }
        },
        {
          "match": {
            "code": {
              "query": "value2"
            }
          }
        },
        {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "match": {
                  "code": {
                    "query": "value3"
                  }
                }
              },
              {
                "match": {
                  "code": {
                    "query": "value4"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "match": {
                  "code": {
                    "query": "value5"
                  }
                }
              },
              {
                "match": {
                  "code": {
                    "query": "value6"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

这是

的 NEST 等价物
void Main()
{
    var client = new ElasticClient();

    client.Search<MyDocument>(s => s
        .Query(q => q
            .Bool(b => b
                .Must(mu => mu
                    .Match(m => m
                        .Field(f => f.Code)
                        .Query("value1")
                    ), mu  => mu
                    .Match(m => m
                        .Field(f => f.Code)
                        .Query("value2")
                    ), mu => mu
                    .Bool(bb => bb
                        .MinimumShouldMatch(1)
                        .Should(sh => sh
                            .Match(m => m
                                .Field(f => f.Code)
                                .Query("value3")
                            ), sh => sh
                            .Match(m => m
                                .Field(f => f.Code)
                                .Query("value4")
                            )
                        )
                    ), mu => mu
                    .Bool(bb => bb
                        .MinimumShouldMatch(1)
                        .Should(sh => sh
                            .Match(m => m
                                .Field(f => f.Code)
                                .Query("value5")
                            ), sh => sh
                            .Match(m => m
                                .Field(f => f.Code)
                                .Query("value6")
                            )
                        )
                    )
                )
            )
        )
    );
}

public class MyDocument
{
    public string Code { get; set; }
}

这是另一个使用更具体样本数据的示例:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "author": {
              "query": "Anita Author"
            }
          }
        },
        {
          "match": {
            "author": {
              "query": "Bertha Booster"
            }
          }
        }
      ],
      "should": 
      [
          {
            "match": {
              "title": {
                "query": "A Fantastic Book"
              }
            }
          },
        {
          "match": {
            "title": {
              "query": "A Fantastic Book, Volume 2"
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "Yet Another Fantastic Book"
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}