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 |
已有 0人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐