我的映射如下:
"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}
无论如何,我可以过滤每项教育的两个条款吗?
答案 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/