弹性搜索字典中的多个术语

时间:2013-12-18 03:32:29

标签: elasticsearch

我的映射如下:

 "profile": {
        "properties": {               
            "educations": {
                "properties": {
                    "university": {
                        "type": "string"
                    },
                    "graduation_year": {
                        "type": "string"
                    }
                 }
             }
         }
   }

显然拥有人们的教育历史。每个人都可以接受多种教育。我想做的是搜索“2012”中从“SFU”毕业的人。为此,我使用过滤搜索:

"filtered": {
     "filter": {
        "and": [
           {
              "term": {
                 "educations.university": "SFU"
              }
           },
           {
              "term": {
                 "educations.graduation_year": "2012"
              }
           }
        ]
     }

但是这个查询的作用是找到在他们的教育中有“SFU”和“2012”的文档,所以这个文档会匹配,这是错误的:

educations[0] = {"university": "SFU", "graduation_year": 2000}
educations[1] = {"university": "UBC", "graduation_year": 2012}

无论如何,我可以过滤每项教育的两个条款吗?

1 个答案:

答案 0 :(得分:2)

您需要为educations定义嵌套类型并使用嵌套过滤器对其进行过滤,否则Elasticsearch会在内部将内部对象展平为单个对象,并返回错误的结果。 您可以在这里参考详细解释和样本:

http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/ http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/