elasticsearch中must和should組合查詢

引言

  以前在使用es must和should混合使用的時候,發現should不起做用了。java

  es版本5.6數據庫

參考

  https://segmentfault.com/q/1010000008089977?_ea=1544390segmentfault

  https://blog.csdn.net/u012116196/article/details/51789253elasticsearch

問題

例如在a=1且b=2的數據中,找出c=1或者d=2的數據
{"query": {
   "bool": {
  "must": [
     {"match": {
      "a": "1",
      "b": "2"
  }}
  ],
   "should": [
      {"match": {
       "c": "1"
     },
    {"match": {
    "d": "2"
    }}
  ]
}}}
這樣寫的時候should是沒有用的,這是新手可能犯的錯誤之一。
在編寫查詢條件的時候,不能用口頭上的邏輯進行編寫,而是要換成數學邏輯才能進行執行(數據庫同理)。

如上例,數學邏輯應該是 (a==1&&b==2&&c==1)||(a==1&&b==2&&d==2)(java and c語言版),這樣的結構去查詢。

解決

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

JAVA API

QueryBuilder query = QueryBuilders.boolQuery()
                    .should(QueryBuilders.boolQuery()
                            .filter(QueryBuilders.termQuery("a", 1))
                            .filter(QueryBuilders.termQuery("b", 2))
                            .filter(QueryBuilders.termQuery("c", 1))
                    .should(QueryBuilders.boolQuery()
                            .filter(QueryBuilders.termQuery("a", 1))
                            .filter(QueryBuilders.termQuery("b", 2))
                            .filter(QueryBuilders.termQuery("d", 2));
相關文章
相關標籤/搜索