ElasticSearch中的嵌套搜索不起作用?

时间:2016-07-12 10:37:15

标签: java elasticsearch

我想获取国家名称为“India”的所有州。 为什么我无法使用弹性搜索搜索嵌套数据?

异常:嵌套:路径[country]下的QueryParsingException [[userinfo] [nested]嵌套对象不是嵌套类型]; }]

查询我正在执行:

userinfo是索引名称,状态是类型

        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;
            }




        }

2 个答案:

答案 0 :(得分:1)

Try This with match : 

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

答案 1 :(得分:0)

这将为您提供所有具有国家/地区的文件

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