Home > database >  ElastiSearch combine result set of two queries
ElastiSearch combine result set of two queries

Time:12-01

I have below data structure in ElastiSearch.

[{
  "name": "Kapil",
  "age": 32,
  "hobbies": ["Cricket", "Football", "Swimming"]
},
{
  "name": "John",
  "age": 33,
  "hobbies": ["Baseball", "Football", "Swimming"]
},
{
  "name": "Vick",
  "age": 30,
  "hobbies": ["Baseball", "Karate", "Swimming"]
}]

I want to get all records from the data in following order:

  1. Get all users which has Football as hobby and sort them by age desc.
  2. Get all other users sort by age desc.

So expecting result in following order John, Kapil and Vick.

I used below query to get result for #1.

{
   "size": 500,
   "query": {
     "bool": {
       "must": [
        {
          "match_phrase": {
            "hobbies.keyword": "Football"
          }
        }
       ]
     }
   },
   "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

and used below for point #2

{
   "size": 500,
   "query": {
     "bool": {
       "must_not": [
        {
          "match_phrase": {
            "hobbies.keyword": "Football"
          }
        }
       ]
     }
   },
   "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

With above, I am not able to maintain the paging logic. It also requires me to execute both queries separately. Can Someone please help how to achieve this?

CodePudding user response:

Try this out:

{
    "query": {
        "bool": {
            "must": {
                "match_all": {} <-- retrieve all docs
            },
            "should": { <-- give higher score to docs that match this clause
                "match_phrase": {
                    "hobbies.keyword": "Football"
                }
            }
        }
    },
    "sort": [
        "_score", <-- sort by doc score first
        {
            "age": { <-- when score is equal then sort by age
                "order": "desc"
            }
        }
    ]
}
  • Related