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

itlao6 .NET DB 原创 开发&源码41,132字数 1279阅读4分15秒阅读模式

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

elasticsearch:or操作should及其与must/filter混用的两种实现文章源自IT老刘-https://itlao6.com/1713.html

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

在elasticssearch中,or操作可以用should,比如满足a=1或b=2的实现如下:文章源自IT老刘-https://itlao6.com/1713.html

{"query": {
   "bool": {
   "should": [
      {"match": {
       "a": "1"
     },
    {"match": {
    "b": "2"
    }}
  ]
}}}

那如果我们将上述条件改为:满足a=1或b=2,并且c=3,也许很多朋友会犯跟我一样的错误,即在上述代码中增加一个must:c=3,即:文章源自IT老刘-https://itlao6.com/1713.html

{"query": {
   "bool": {
  "must": [
     {"match": {
      "c": "3"
  }}
  ],
   "should": [
      {"match": {
       "a": "1"
     },
    {"match": {
    "b": "2"
    }}
  ]
}}}

乍一看,没什么问题,即满足must中的条件,并满足should中的一个条件,然而,这样一运行,得到的结果好像只有c=3,而少了a和b的过滤;怎么回事呢?文章源自IT老刘-https://itlao6.com/1713.html

其实shoule在与must或者filter同级时,默认是不需要满足should中的任何条件的,此时我们可以加上minimum_should_match 参数,来达到我们的目的,即上述代码改为:文章源自IT老刘-https://itlao6.com/1713.html

{"query": {
   "bool": {
  "must": [
     {"match": {
      "c": "3"
  }}
  ],
   "should": [
      {"match": {
       "a": "1"
     },
    {"match": {
    "b": "2"
    }}
  ],
    "minimum_should_match":1
}}}

上述代码表示,必须满足must中的所有条件,并且至少满足should中的一个条件,这样,就得到了预期的结果。文章源自IT老刘-https://itlao6.com/1713.html

当然,我们也可以使用另一种方式实现,即将should放入到must中的一个bool条件中,即用分层的方式让should和must不同时出现,实现如下:文章源自IT老刘-https://itlao6.com/1713.html

{"query": {
    "bool": {
       "must": [
       {
             "match": { "c": "3" },
             "bool": {
                 "should": [
               {
                   "match": { "a": "1"  },
                   "match": { "b": "2"  } 
                }
        } 
  ]
}}}

上述两种方式都可以解决should与must或者filter共存的问题,具体如何选择,视具体情况而定即可。文章源自IT老刘-https://itlao6.com/1713.html

相关的java和c#实现后续提供文章源自IT老刘-https://itlao6.com/1713.html

博客:IT老五   简书:ThinkinLiu文章源自IT老刘-https://itlao6.com/1713.html

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

关注公众号,与老五一起进步!

文章源自IT老刘-https://itlao6.com/1713.html文章源自IT老刘-https://itlao6.com/1713.html
继续阅读
weinxin
我的微信公众号
微信扫一扫关注公众号,不定时更新
itlao6
  • 本文由 发表于 2019年 11月 17日 23:21:56
  • 转载请务必保留本文链接:https://itlao6.com/1713.html
  • should和must
  • filter
  • elasticsearch filter should
  • es索引
  • elasticsearch基础
  • Elastic Search
  • or操作
评论  4  访客  4
    • 多乐猫
      多乐猫 6

      嗯,只要业务能支撑住就行

      • 夏日博客
        夏日博客 6

        • 龙奇网
          龙奇网 6

          感觉这个还是太吃内存了,一般的个人网站,玩不起这个,还是lucene 这样的好一些。

            • 百万链
              百万链 6

              @ 龙奇网 重要的是你用到用不到的问题,吃内存都是小问题了。http://www.baiwanlian.net/ 百万链

          匿名

          发表评论

          匿名网友

          :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

          确定