Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
235 views
in Technique[技术] by (71.8m points)

elasticsearch - Elastic search combine two must with OR

I need to achieve following logic in elasic search

(ticketype=1 AND customerid= id AND available >1) OR(tickettype = 2 AND available >1 )

I have below query with me

"query": {
                          "bool": {
                             "minimum_should_match": 1,
                             "should": [
                              {
                                 "bool": {
                                   "must": [
                                      {
                                         "range": {
                                            "ticket_group.available": {
                                               "gte": 1
                                            }
                                         }
                                      },
                                      {
                                         "match": {
                                            "ticket_group.customer_id": (q.customer_id) ? q.customer_id : ""
                                         } 
                                      },
                                      {
                                         "match": {
                                            "ticket_group.ticket_type": 1
                                         }
                                      }
                                   ]
                                }
                             }
                             ,
                              {  
                                 "bool":{  
                                        "must":[  
                                           {  
                                              "range":{  
                                                 "ticket_group.available":{  
                                                    "gte":1
                                                 }
                                              }
                                           },
                                           {  
                                              "match":{  
                                                 "ticket_group.ticket_type":2
                                              }
                                           }
                                        ]
                                     }
                              }

                           ]
                          }

                       }

But it seems that it is taking all conditions in AND even after use of should. What should be the correct query ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I have used nested query, without it search on nested properties does not work properly. I have simplified your query to AND ((ticketype=1 AND customerid = id) OR ( tickettype = 2 ) ) AND available >1

Try following query:

{
"query": {
  "nested": {
     "path": "ticket_group",
     "query": {
        "bool": {
           "must": [
              {
                 "range": {
                    "ticket_group.available": {
                       "gte": 1
                    }
                 }
              },
              {
                 "bool": {
                    "minimum_should_match": 1,
                    "should": [
                       {
                          "match": {
                             "ticket_group.ticket_type": 2
                          }
                       },
                       {
                          "match": {
                             "ticket_group.customer_id": 1
                          }
                       }
                    ]
                 }
              }
           ]
        }
     }
   }
  }
 }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...