【问题标题】:Multiple should queries with must query带有必须查询的多个应该查询
【发布时间】:2017-03-27 05:15:11
【问题描述】:

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

必须有 value1 和 value 2

应该有 value3 或 value 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,但仍然得到结果)

谢谢

【问题讨论】:

  • 您的布尔查询中只能有一个 should 子句。在我看来,你的一个应该条款被驳回了。为什么不将所有 should 匹配项放在一个 should 子句中?
  • 因为我需要 value3 或 value4 以及 value5 或 value6

标签: elasticsearch nest elasticsearch-net elasticsearch-5


【解决方案1】:

那么你需要这样的东西:

{
  "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"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

【讨论】:

    【解决方案2】:

    这是 Val's answer 的 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; }
    }
    

    【讨论】:

      【解决方案3】:

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

      {
        "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
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 1970-01-01
        • 2020-07-31
        • 2021-12-08
        • 2018-09-20
        • 2018-03-14
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        相关资源
        最近更新 更多