른록노트
[ES6.5] join data type 정리 본문
@ 설명
join type은 하나의 인덱스 내에서 상위, 하위 관계를 나타내는 필드
이레스틱 조인필드는 관계DB의 조인과 다름
일대다 관계를 필드로 만듬 하지만 이레스틱은 비정형화 데이터를 사용하는게 성능엔 더 좋음
@ 유의사항
인덱스 당 하나의 조인필드만 있을 수 있음,
하위문서 만들때 같은 샤드에서 만들어야되는데 그때 라우트값을 사용
join을 빨리하기위해 인덱스 생성시 eager_global_ordinals를 사용 할 수 있지만,
join필드를 자주 사용하지 않고 write가 자주되면 eager_global_ordinals:false가 좋음 (성능저하)
@ 사용법
-인덱스 맵핑
test_join_index
{
"mappings": {
"doc": {
"dynamic": "strict",
"properties": {
"my_join_field": {
"type": "join",
"relations": {
"dosi": "univ"
}
},
"univ_name": {
"type": "keyword"
},
"dosi_name": {
"type": "keyword"
}
}
}
}
}
-데이터 등록
test_join_index/doc/1
{
"dosi_name": "seoul",
"univ_name": null,
"my_join_field": {
"name": "dosi"
}
}
test_join_index/doc/3?routing=1&refresh
{
"dosi_name": "seoul",
"univ_name": "seoul_univ",
"my_join_field": {
"name": "univ",
"parent": "1"
}
}
-검색
1. query로 자식들을 찾을 수 있음
test_join_index/_search
{"query": { "parent_id": { "type": "univ", "id": "1" }}}
2. aggr할때 필드명#parent name 으로 통계를 낼 수 있음,
test_join_index/_search
{"aggs": { "parents": { "terms": { "field": "my_join_field#dosi", "size": 10 }}}}
3. parent_id 가져오는 방법
test_join_index/_search
{"script_fields": {"parent": { "script": { "source": "doc['my_join_field#question']" }}}}
참고사이트
https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html#parent-join