ElasticSearch语句中must,must_not,should 组合关系

前言:

在实际应用中,发现当bool中同时使用must和should 没有达到想要的想过,而是只展示了must中的命中数据,所以打算探究一下bool中 三种逻辑关系的组合。
在这里插入图片描述
上述查询语句只展示了must的结果,没有should中的结果,(我一开始以为是must 和 should 是交集的关系)

概念

一、单个使用概念

  • must(且):数组里面的条件都要满足,该条数据才被选择,所有的条件为且的关系,既交集
  • must_not(或,然后取反):数组里面的条件满足其中一个,该条数据则不被选择,既差集
  • should(或):数组里面的条件满足其中一个,该条数据被选择,既并集

二、must和must组合(A、B交集)

  • 多个must 组合,就是求这些条件数据的交集

三、must_not和must_not组合(all-A-B)

  • 多个must_not组合,就是全部的数据减去命中 must_not 的数据集

四、should和should组合(A、B并集)

  • 多个should组合,就是求这些条件数据的并集

五、must和must_not组合(A-B)

  • 满足must的数据减去满足must_not的数据则是最终结果

六、must和should组合(A)

  • 满足must的数据
  • should用来打分(字段为:_score ),影响返回排序
  • 满足should条件的数据分值会更高

七、should和must_not组合(A-B)

  • 满足should的数据减去满足must_not的数据则是最终结果

八、must和should和must_not组合(A-C)

  • 满足must的数据减去满足must_not的数据则是最终结果
  • should用来打分,影响返回排序
  • 满足should条件的数据分值会更高

实验

一、数据准备

PUT mystore
----------------
POST mystore/_bulk
{"index":{"_id":1}}
{"price":10,"productID":"XHDK-A-1293-#fJ3"}
{"index":{"_id":2}}
{"price":20,"productID":"XHDK-A-1293-#f20"}
{"index":{"_id":3}}
{"price":30,"productID":"JODL-X-1937-#pV7"}
{"index":{"_id":4}}
{"price":40,"productID":"QQPX-R-3956-#aD8"}
{"index":{"_id":5}}
{"price":50,"productID":"KDKE-B-9947-#kL5"}
{"index":{"_id":6}}
{"price":60,"productID":"KDKE-B-9947-#kL5"}
{"index":{"_id":7}}
{"price":70,"productID":"JODL-X-1937-#pV7"}
{"index":{"_id":8}}
{"price":80,"productID":"JODL-X-1937-#pV7"}

二、must和must组合(A、B交集)

GET mystore/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 20,
              "lte": 50
            }
          }
        },
         {
          "range": {
            "price": {
              "gte": 30,
              "lte": 60
            }
          }
        }
      ]
    }
  }
}

结果:30,40,50
在这里插入图片描述

三、must_not和must_not组合(all-A-B)

GET mystore/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "price": "40"
          }
        },
        {
          "match": {
            "price": "70"
          }
        }
      ]
    }
  }
}

结果:10,20,30,50,60,80
在这里插入图片描述

四、should和should组合(A、B并集)

GET mystore/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "price": {
              "gte": 40,
              "lte": 60
            }
          }
        },
         {
          "range": {
            "price": {
              "gte": 50,
              "lte": 70
            }
          }
        }
      ]
    }
  }
}

结果:50,60,40,70
谁命中的多,谁分数高,在前边
在这里插入图片描述

五、must和must_not组合(A-B)

GET mystore/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 20,
              "lte": 50
            }
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "price": "40"
          }
        }
      ]
    }
  }
}

结果:20,30,50
在这里插入图片描述

六、must和should组合(A)

GET mystore/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 20,
              "lte": 50
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "price": {
              "gte": 40,
              "lte": 60
            }
          }
        }
      ]
    }
  }
}

结果:40,50,20,30
只展示must的数据集,但是在should中提到的数据,分数高,在前边
在这里插入图片描述

七、should和must_not组合(A-B)

GET mystore/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "price": {
              "gte": 40,
              "lte": 60
            }
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "price": "40"
          }
        }
      ]
    }
  }
}

结果:50,60
在这里插入图片描述

八、must和should和must_not组合(A-C)

GET mystore/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 20,
              "lte": 50
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "price": {
              "gte": 40,
              "lte": 60
            }
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "price": "40"
          }
        }
      ]
    }
  }
}

结果:50,20,30
结果就是must - must_not,不过在should中提到的数据分数高,在前边
在这里插入图片描述

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苍煜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值