Home > Software design >  Elastic Search - Multiple match condition
Elastic Search - Multiple match condition

Time:12-02

I need to write one complex scenario and wondering how to do that - I have 3 different types entry as below

I need to find the call status with **completed **, but there are scenario where status with completed stored in 2 entries.

Record-1 [ Condition-1: when lastOutboundStatus is busy and lastInbountStatus is completed ]

Note: lastOutboundStatus should be busy | it can be other status as well like no-answer, rejected

"lastOutboundStatus": {
  "status": "busy",
  "timeStamp": 1664945413238
 },
 "lastInboundStatus": {
  "status": "completed",
  "timeStamp": 1664945413238
 },

Record-2 [ Condition-2: when lastInbountStatus is completed and lastOutboundStatus does not exist ]

"lastInboundStatus": {
  "status": "completed",
  "timeStamp": 1664945413238
 }

Record-3 [ Condition-3: when lastOutboundStatus is completed, and "lastInboundStatus" may exist or not exist, does not matter - priority is if lastOutboundStatus is completed ]

"lastOutboundStatus": {
  "status": "completed",
  "timeStamp": 1664945413238
 }
"lastInboundStatus": {
  "status": "completed",
  "timeStamp": 1664945413238
 },

With just one single query I need to accommodate the 3 conditions - so that proper records will come. SO when I search with status completed, all above 3 records should come.

Any Ninja can help !!!!

I am newbie here in elasticsearch, need some master's help

CodePudding user response:

You can use the following OR query:

POST test/_search
{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "lastInboundStatus.status": "completed"
                }
              },
              {
                "terms": {
                  "lastOutboundStatus.status": [
                    "busy",
                    "other-status"
                  ]
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "lastInboundStatus.status": "completed"
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "lastOutboundStatus.status"
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "term": {
            "lastOutboundStatus.status": "completed"
          }
        }
      ]
    }
  }
}
  • Related