es并不擅长关联查询,其提供的解决方案有三种:对象,嵌套对象,父子文档
POST moive/_doc/1
{
"movie":"first blog",
"actors":[{
"firstName":"lu",
"lastName":"yong"
},{
"firstName":"liu",
"lastName":"yo3ng"
}
]
}
GET moive/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"actors.firstName":"lu"
}
},
{
"match": {
"actors.lastName":"yo3ng"
}
}
]
}
}
}
PUT my_movie
{
"mappings": {
"properties": {
"actors":{
"type":"nested",
"properties": {
"lastName": {
"type":"keyword"
},
"firstName": {
"type":"keyword"
}
}
}
}
}
}
POST my_movie/_doc/1
{
"title":"speed",
"actors":[
{
"firstName":"zhou",
"lastName":"yong"
},
{
"firstName":"lu",
"lastName":"ha"
}
]
}
GET my_movie/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "speed"
}
},
{
"nested": {
"path": "actors",
"query": {
"bool": {
"must": [
{"match":{"actors.firstName":"zhou"}},
{"match":{"actors.lastName":"yong"}}
]
}
}
}
}
]
}
}
}
父子文档的本身是同一个索引的两个类别,创建文档时指定标识表示其是父文档和子文档,在子文档中指定父文档的id。
PUT my_blog
{
"mappings": {
"properties": {
"blog_comment_relation":{
"type": "join",
"relations":{
"blog":"comment"
}
}
}
}
}
POST my_blog/_doc/blog1
{
"title":"hadoop good",
"author":"george",
"blog_comment_relation":{
"name":"blog"
}
}
POST my_blog/_doc/blog2
{
"title":"elastic search",
"author":"george",
"blog_comment_relation":{
"name":"blog"
}
}
POST my_blog/_doc/comment1?routing=blog1
{
"title":"i love hadoop search",
"author":"george",
"blog_comment_relation":{
"name":"comment",
"parent":"blog1"
}
}
POST my_blog/_doc/comment2?routing=blog2
{
"title":"i love elastic search",
"author":"george",
"blog_comment_relation":{
"name":"comment",
"parent":"blog2"
}
}
POST my_blog/_search
{
"query": {
"has_parent": {
"parent_type": "blog",
"query": {
"match": {
"title": "hadoop"
}
}
}
}
}
// 查询评论
POST my_blog/_search
{
"query": {
"parent_id":{
"type":"comment",
"id":"blog1"
}
}
}
// 查询评论
POST my_blog/_search
{
"query": {
"has_child": {
"type": "comment",
"query": {
"match": {
"author": "george"
}
}
}
}
}
GET my_blog/_doc/blog1
GET my_blog/_doc/comment1