bhanwar rathore
bhanwar rathore

Reputation: 348

Nested Search in ElasticSearch not working?

I want to fetch all the states where country name is "India" . Why I am not able to search nested data with elastic search ?

Exception : nested: QueryParsingException[[userinfo] [nested] nested object under path [country] is not of nested type]; }]


Query I am Executing :

userinfo is the index name and state is the type

        POST /userinfo/state/_search?v
        {
            "query": {
                "nested": {

                   "path": "country",
                   "query": {
                       "match": {
                          "country.name": "India"
                       }
                   }
                }
            }
        }

        ------------------------------
        My Json is for state type : 

        {
                    "_index": "userinfo",
                    "_type": "state",
                    "_id": "35",
                    "_score": 1,
                    "_source": {
                       "id": "35",
                       "name": "County Down",
                       "abbreviation": "DWN",
                       "isDeleted": 0,
                       "country": {
                          "id": "3",
                          "name": "United Kingdom",
                          "abbreviation": "UK",
                          "isDeleted": 0
                       }
                    }
                 }

        -------------------------------------

 </br></br>
        State.java

        package com.elastic.entity;

        import org.springframework.data.annotation.Id;
        import org.springframework.data.elasticsearch.annotations.Document;
        import org.springframework.data.elasticsearch.annotations.Field;
        import org.springframework.data.elasticsearch.annotations.FieldType;

        @Document(indexName = "userinfo", type = "state")
        public class State {


            @Id
            private String id;

            private String name;
            private String abbreviation;
            private int isDeleted;

            @Field(type = FieldType.Nested)
            private Country country;



            public State()
            {
                super();
            }

            public State(String id, String name, String abbreviation, int isDeleted, Country country) {
                super();
                this.id = id;
                this.name = name;
                this.abbreviation = abbreviation;
                this.isDeleted = isDeleted;
                this.country = country;
            }


            public String getId() {
                return id;
            }
            public void setId(String id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String getAbbreviation() {
                return abbreviation;
            }
            public void setAbbreviation(String abbreviation) {
                this.abbreviation = abbreviation;
            }
            public int getIsDeleted() {
                return isDeleted;
            }
            public void setIsDeleted(int isDeleted) {
                this.isDeleted = isDeleted;
            }
            public Country getCountry() {
                return country;
            }
            public void setCountry(Country country) {
                this.country = country;
            }




        }

Upvotes: 0

Views: 143

Answers (2)

user4772709
user4772709

Reputation:

Try This with match : 

POST /index/type/_search?v
{
    "query": {
        "match": {
           "state.country.name": "India"
        }
    }
}

Upvotes: 1

vinayak_narune
vinayak_narune

Reputation: 737

This will give you all documents having country India

{
  "query": {
    "query_string": {
      "default_field": "country.name"
      , "query": "India"
    }
  }
}

Upvotes: 0

Related Questions