Elasticsearch做"关联查询"——nested-parent关系
- - zzmElasticsearch作为一个面向文档的存储服务,并没有严格意义上的关联查询能力. 但可以通过mapping来指定文档的nested-parent关系,实现关联. 下面以学生(student)和班级(clazz)的关系为例,演示这种"关联查询":. 建立一个索引test,有student和clazz两个type,存储班级和学生.
Elasticsearch作为一个面向文档的存储服务,并没有严格意义上的关联查询能力。但可以通过mapping来指定文档的nested-parent关系,实现关联。
下面以学生(student)和班级(clazz)的关系为例,演示这种"关联查询":
建立一个索引test,有student和clazz两个type,存储班级和学生
首先设置班级和学生的mapping:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
PUT /test { "mappings" : {
"clazz" : {
"properties" : {
"students" : {
"type" : "nested"
}
}
},
"student" :{
"_parent" : {
"type" : "clazz"
}
}
}
} |
实测clazz的映射描述可以省略
插入测试数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//班级 PUT /test/clazz/c1 { "name" : "class1" ,
"teacher" : "Mr wang"
} //学生,通过parent=c1将其关联至班级class1 PUT /test/student/s1?parent=c1 { "name" : "tom" ,
"age" : 15
} //学生,通过parent=c1将其关联至班级class1 PUT /test/student/s2?parent=c1 { "name" : "小明" ,
"age" : 16
} |
然后就可以查询了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//查询班级class1中有哪些学生 GET /test/student/_search { "query" : {
"has_parent" : {
"type" : "clazz" ,
"query" : {
"match" :{
"name" : "class1"
}
}
}
}
} //查询小明在哪个班 GET /test/clazz/_search { "query" : {
"has_child" : {
"type" : "student" ,
"query" : {
"term" : {
"name" : {
"value" : "小明"
}
}
}
}
}
} http://www.wowtools.org/blog/articles/2015/09/08/1441692036407.html
|