Elasticsearch nested filtering (elastic4s, scala)

497 views Asked by At

I am using Elasticsearch 1.7 and elastic4s DSL. My problem is I can't add and & or filter on a nested document. For example, here is a JSON representation of my instance of case class Candidate:

{
  "name": "Samy"
  "interviews": [
    {
      "clientId": 0,
      "stateId": "CANCELED",
    },
    {
      "clientId": 1,
      "stateId": "APPROVED"
    }
  ]

Here is my filter :

def filtering(interviewAndCandidates: IntCand)(implicit user: PublicUser): Seq[FilterDefinition] = {
nestedFilter("interviews").filter(termFilter("clientId", user.id)) ::
List(or(interviewAndCandidates.interviews.map(state ⇒ nestedFilter("interviews").filter(termFilter("stateId", state)))))
}

Then I build the query:

var request: SearchDefinition = search in "myIndex" -> "candidate" query {
  filteredQuery query {
    matchAllQuery
  } filter {
    and(filters)
  }
}

With:

case class IntCand(interviews: List[String])

case class Candidate(name: String, interviews: List[Interview])

case class Interview(clientId: Long, stateId: String)

The problem is when I filter on IntCand(List("CANCELED")) and clientId=1, the response show me the Candidate (I want filter on clientId AND interviews)

1

There are 1 answers

0
Samy Zarour On

I succeed by denormalizing the data