른록노트

[ES6.5] join data type 정리 본문

DB/[Elasticsearch]

[ES6.5] join data type 정리

른록 2019. 1. 18. 11:16

@ 설명

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


반응형
Comments