elasticsearch:or操作should及其与must/filter混用的两种实现

项目需要,又开始找虐!最近两周,因为项目上的需求,用到了elasticsearch,带着“迎难而上,不懂就学”的精神,开始了又一轮的找虐之旅。

 
9166166-264de44b8c27b6e0.jpg
Elastic Search

这两周完成相关功能开发后,感觉整体上elasticsearch其实还是比较容易上手的,不过其中也遇到了一些问题:比如,sql中的or操作或者no操作、添加字段根据term或者match匹配无法得到预期结果、text和keyword、index等问题,现在我们先来说说or操作的实现。

在elasticssearch中,or操作可以用should,比如满足a=1或b=2的实现如下:

{"query": {

  "bool": {

  "should": [

      {"match": {

      "a": "1"

     },

    {"match": {

    "b": "2"

    }}

  ]

}}}

那如果我们将上述条件改为:满足a=1或b=2,并且c=3,也许很多朋友会犯跟我一样的错误,即在上述代码中增加一个must:c=3,即:

{"query": {

  "bool": {

  "must": [

    {"match": {

      "c": "3"

  }}

  ],

  "should": [

      {"match": {

      "a": "1"

     },

    {"match": {

    "b": "2"

    }}

  ]

}}}

乍一看,没什么问题,即满足must中的条件,并满足should中的一个条件,然而,这样一运行,得到的结果好像只有c=3,而少了a和b的过滤;怎么回事呢?

其实shoule在与must或者filter同级时,默认是不需要满足should中的任何条件的,此时我们可以加上minimum_should_match 参数,来达到我们的目的,即上述代码改为:

{"query": {

  "bool": {

  "must": [

    {"match": {

      "c": "3"

  }}

  ],

  "should": [

      {"match": {

      "a": "1"

     },

    {"match": {

    "b": "2"

    }}

  ],

    "minimum_should_match":1

}}}

上述代码表示,必须满足must中的所有条件,并且至少满足should中的一个条件,这样,就得到了预期的结果。

当然,我们也可以使用另一种方式实现,即将should放入到must中的一个bool条件中,即用分层的方式让should和must不同时出现,实现如下:

{"query": {

    "bool": {

      "must": [

      {

            "match": { "c": "3" },

            "bool": {

                "should": [

              {

                  "match": { "a": "1"  },

                  "match": { "b": "2"  }

                }

        }

  ]

}}}

上述两种方式都可以解决should与must或者filter共存的问题,具体如何选择,视具体情况而定即可。

相关的java和c#实现后续提供

博客:IT老五  简书:ThinkinLiu

 
9166166-99bb088855908d9c.jpg
关注公众号,与老五一起进步!
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值