should
在使用es時,如果需要用到or邏輯,可以使用should。
minimum_should_match
should,可以配合 minimum_should_match 使用。
minimum_should_match是最低匹配度, minimum_should_match為1, 表示should條件中,至少有一項符合。
注意,should和must一起用,should會失效,加上minimum_should_match 就可以了。
示例1
比如, a && (b or c) ,可以如下所示:
{
"bool" : {
"filter" : [
{
"terms" : {
"查詢條件a" : [
"a值"
],
"boost" : 1.0
}
}
],
"should" : [
{
"terms" : {
"查詢條件b" : [
"b值"
],
"boost" : 1.0
}
},
{
"terms" : {
"查詢條件c" : [
"c值"
],
"boost" : 1.0
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"minimum_should_match" : "1",
"boost" : 1.0
}
}
對應的java代碼如下:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.filter(QueryBuilders.termsQuery("查詢條件a", "a值"));
boolQuery.should(QueryBuilders.termsQuery("查詢條件b", "b值"))
.should(QueryBuilders.termsQuery("查詢條件c", "c值"))
.minimumShouldMatch(1);
示例2
比如, a && ((b && c) or (d && e)) ,可以如下所示:
{
"bool" : {
"filter" : [
{
"terms" : {
"查詢條件a" : [
"值a"
],
"boost" : 1.0
}
}
],
"should" : [
{
"bool" : {
"must" : [
{
"terms" : {
"查詢條件b" : [
"值b"
],
"boost" : 1.0
}
},
{
"term" : {
"查詢條件c" : {
"value" : "值c",
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
{
"bool" : {
"must" : [
{
"terms" : {
"查詢條件d" : [
"值d"
],
"boost" : 1.0
}
},
{
"term" : {
"查詢條件e" : {
"value" : "值e",
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"minimum_should_match" : "1",
"boost" : 1.0
}
}
對應的java代碼如下:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.filter(QueryBuilders.termsQuery("查詢條件a", "值a"));
boolQuery.should(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("查詢條件b", "值b"))
.must(QueryBuilders.termQuery("查詢條件c", "值c")))
.should(QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("查詢條件d", "值d"))
.must(QueryBuilders.termQuery("查詢條件e", "值e")))
.minimumShouldMatch(1);
System.out.println(boolQuery);
小技巧: 直接寫dsl,會比較麻煩,用代碼去把dsl打印出來,會方便很多。
參考資料
http://events.jianshu.io/p/84789dd89dcf
https://blog.csdn.net/qq_31748587/article/details/101449613