2017-09-07 5 views
0

elasticsearch에 관계형 데이터를 저장하는 옵션은 무엇입니까? 나는 다음은 접근 알고elasticsearch에 관계형 데이터를 저장하는 방법

  1. 중첩 된 객체 : - 나는 다른 문서를 변경하지 않고 내가 다음이 중첩 된 개체를 사용하는 경우 하나의 문서를 업데이트 할 때문에 중첩 된 형식의 데이터를 저장하지 않으 부모 문서에서 하위 데이터가 반복됩니다.

  2. 부모 - 자식 : - 단일 인덱스에 데이터를 저장하고 싶지 않지만 부모 - 자식 데이터를 하나의 인덱스 (다른 유형)에 있어야합니다. 나는이 제한이 https://github.com/elastic/elasticsearch/issues/15613 문제에서 언급 된대로 향후 릴리스에서 제거 될 것이지만 5.5 버전에서 작동해야하는 솔루션을 원한다는 것을 알고 있습니다.

위의 다른 방법이 있습니까?

답변

0

두 가지 더 접근법이 있습니다 : Denormalizationrunning multiple queries for joins.

비정규 화는 더 많은 공간을 차지하고 쓰기 시간을 늘리지만 데이터를 검색하기 위해 하나의 쿼리 만 실행하면 읽기 시간이 향상됩니다. 하나의 인덱스에 데이터를 저장하고 싶지 않으므로 가입하면 도움이 될 것입니다.

2

중첩 된 객체은 완벽한 접근 방식입니다. 자식 개체를 올바르게 업데이트하면 부모 문서에 자식 개체가 반복해서 표시되지 않습니다. 마스터 - 일대 다 관계의 관계형 데이터를 유지해야하는 경우에 대해 동일한 접근 방식을 사용하고 있습니다. 나는 & 업데이트 중첩 된 아이를 기존 중복 또는 반복되는 항목을 작성하지 않고 부모 문서 내에서 객체를 추가 업데이트 API에 대한 고통 스크립트를 작성했습니다.

업데이트 답 : 아래

임베디드 중첩 된 형태의 문서 "차일"와 부모 - 자식 중첩 된 형식의 문서의 구조입니다.

{ 
    "parent_id": 1, 
    "parent_name": "ABC", 
    "parent_number": 123, 
    "parent_addr": "123 6th St. Melbourne, FL 32904" 
    "childs": [ 
     { 
     "child_id": 1, 
     "child_name": "PQR", 
     "child_number": 456, 
     "child_age": 10 
     }, 
     { 
     "child_id": 2, 
     "child_name": "XYZ", 
     "child_number": 789, 
     "child_age": 12 
     }, 
     { 
     "child_id": 3, 
     "child_name": "QWE", 
     "child_number": 234, 
     "child_age": 16 
     } 

    ] 
} 

매핑은 다음과 같습니다

RDMS에서
PUT parent/ 
{ 
    "parent": { 
    "mappings": { 
     "parent": { 
     "properties": { 
      "parent_id": { 
      "type": "long" 
      }, 
      "parent_name": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "parent_number": { 
      "type": "long" 
      }, 
      "parent_addr": { 
      "type": "text", 
      "fields": { 
       "keyword": { 
       "type": "keyword", 
       "ignore_above": 256 
       } 
      } 
      }, 
      "child_tickets": { 
      "type": "nested", 
      "properties": { 
       "child_id": { 
       "type": "long" 
       }, 
       "child_name": { 
       "type": "text", 
       "fields": { 
        "keyword": { 
        "type": "keyword", 
        "ignore_above": 256 
        } 
       } 
       }, 
       "child_number": { 
       "type": "long" 
       }, 
       "child_age": { 
       "type": "long" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

, 이들 엔티티 (부모, 자녀) 모두 부모 사이에 많은 관계로 하나와 두 개의 서로 다른 테이블을하다 -> 어린이. 부모의 ID는 하위 행의 외래 키입니다. (id는 두 테이블에 모두 필요함)

이제 Elasticsearch에서 부모 문서를 색인화하려면 id를 색인화해야합니다 (이 경우 parent_id). 색인 부모 문서 쿼리 (PARENT_ID 내가 얘기하고 인덱스를 ID (_id와 문서가 된 ID입니다) = 1) : 이제

POST parent/parent/1 
{ 
    "parent_id": 1, 
    "parent_name": "ABC", 
    "parent_number": 123, 
    "parent_addr": "123 6th St. Melbourne, FL 32904" 
} 

, 부모에게 자녀 (들)을 추가. 이를 위해서는 하위 ID와 상위 ID가 있어야하는 하위 문서가 필요합니다. 하위를 추가하려면 상위 ID가 있어야합니다.다음은 새 하위 항목을 추가하거나 이미있는 하위 항목을 업데이트하는 업데이트 쿼리입니다.

POST parent/parent/1/_update 
{ 
    "script":{ 
    "lang":"painless", 
    "inline":"if (!ctx._source.containsKey(\"childs\")) { 
       ctx._source.childs = []; 
       ctx._source.childs.add(params.child); 
      } else { 
       int flag=0; 
       for(int i=0;i<ctx._source.childs.size();i++){ 
        if(ctx._source.childs[i].child_id==params.child.child_id){ 
         ctx._source.childs[i]=params.child; 
         flag++; 
        } 
       } 
       if(flag==0){ 
        ctx._source.childs.add(params.child); 
       } 
      }", 
    "params":{ 
     "child":{ 
       "child_id": 1, 
       "child_name": "PQR", 
       "child_number": 456, 
       "child_age": 10 
      } 
     } 
    } 
} 

사진을 찍어주세요. 건배!

다른 것이 필요한 경우 알려주십시오.

+0

감사합니다. Hatim, 반복하지 않고 중첩 된 객체를 저장하기 위해 스크립트를 공유 할 수 있습니까? – mkalsi

+0

@mkalsi 예 & 스크립트로 내 답변을 업데이트했습니다. 확인해 봐. –

+0

2 천만 개의 문서를 색인 할 계획이므로 데이터 세트가 매우 큰 경우 인라인 스크립트의 성능은 어떻게됩니까? – mkalsi

관련 문제