ElasticSearch ‐ Query Joins - thought-corner/backend-roadmap GitHub Wiki
RDBMS의 전통적인 Join
- Parent - Child 관계를 다룬다.
- 데이터를 정규화(normalize) 하려 한다. 즉 저장 공간을 최적화하는 방향이다.
Elasticsearch의 Join Query
- 마찬가지로 Parent - Child 관계를 다룬다.
- Elasticsearch는 이 관계를
join 필드 타입으로 관리한다. 이 타입으로 부모 문서와 자식 문서 사이의 관계를 정의한다.
- Parent Document — 주된 개체에 해당하는 문서다. (예: author)
- Child Document — 부모와 연관된 문서다. (예: author의 book들)
- RDBMS와 달리 같은 인덱스 안에 부모 문서와 자식 문서가 함께 들어간다.
매핑과 색인
PUT /library
{
"mappings": {
"properties": {
"my_join": {
"type": "join",
"relations": { "author": "book" }
}
}
}
}
PUT /library/_doc/1
{
"name": "김작가",
"my_join": { "name": "author" }
}
PUT /library/_doc/2?routing=1
{
"title": "엘라스틱서치 입문",
"my_join": { "name": "book", "parent": "1" }
}
질의
has_child — 조건에 맞는 자식을 가진 부모를 찾는다
GET /library/_search
{
"query": {
"has_child": {
"type": "book",
"query": { "match": { "title": "엘라스틱서치" } }
}
}
}
has_parent — 조건에 맞는 부모를 가진 자식을 찾는다
GET /library/_search
{
"query": {
"has_parent": {
"parent_type": "author",
"query": { "match": { "name": "김작가" } }
}
}
}
- 둘 다
inner_hits를 붙이면 어느 자식·부모가 걸렸는지 함께 받을 수 있다.