2016-08-15 6 views
0

리크에지도 목록을 삽입하려면 어떻게해야합니까? Solr을 통해 목록을 쿼리 할 수도 있습니다.리아 삽입 목록

{ 
    "id":"fa0b758cf8de4a40a54f215563bb483c", 
    "version":"g2wAAAABaAJtAAAADN4oTJvAfuENAAE8fWEBag==", 
    "creator":"ADMIN", 
    "creatorAppId":"RIAK_QA_APP1", 
    "creation":1470350862095, 
    "customerId":"68af96dae60ccac4e6", 
    "customerName":"John Appleseed", 
    "orders":[ 
     { 
     "orderId":"238dhu38ehj", 
     "orderType":"sporting", 
     "orderDescription":"Baseball Batt", 
     "dateOfPurchase":"5470354262012", 
     "delivery":"2 day express", 
     "processTimeMS":56, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     }, 
     { 
     "orderId":"9sdjh349hn", 
     "orderType":"furniture", 
     "orderDescription":"Sectional Couch", 
     "dateOfPurchase":"0970354262087", 
     "delivery":"Overnight", 
     "processTimeMS":78, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     }, 
     { 
     "orderId":"1009shdj473", 
     "orderType":"gaming", 
     "orderDescription":"FIFA 2016 - XBox One", 
     "dateOfPurchase":"1470354342013", 
     "delivery":"UPS Ground", 
     "processTimeMS":68, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     } 
    ] 
} 

현재 데이터 모델 별도로 Riak 수가 많은 결과 각 주문 상품에 기록이 지속

여기에 내 타겟 데이터 모델이다. 메시징 시스템이 수천 개의 메시지를 초당 밀기 시작할 때 병목 현상이 발생합니다. 그래서 여기서 의도 (POC의 일종) 모든 고객 당 주문 항목을 "orders" 목록에 통합하고 단일 리소스로 유지하는 것입니다. 배치와 유사합니다.

참고로, Riak은 모든 종류의 배치 삽입물을 지원합니까? 솔루션을 찾을 수 없어서 데이터를 병합하여 수동으로 수행하고 있습니다.

답변

2

Riak에서 복잡한 데이터 구조를 저장하기 위해 특별한 작업을 수행 할 필요가 없습니다. Java 클라이언트는 JSON에 대한 직렬화를 지원합니다 (잭슨에 대한 주석 (예 : 주석)).

DTO로 데이터를 모델링 한 후 Riak의 StoreValue 명령을 통해 데이터를 전송하는 것이 좋습니다. 다음과 같은 코드가 작동합니다 :

public class CustomerData { 
    private String id; 
    private String version; 
    // other customer fields 
    private List<Order> orders; 
} 

public class Order { 
    private String orderId; 
    private String orderType; 
    // other order fields 
} 

CustomerData data = ...; 
Location location = new Location(new Namespace(BUCKET_TYPE, BUCKET_NAME), key); 
StoreValue storeCommand = new StoreValue.Builder(data).withLocation(location).build(); 
riakClient.execute(storeCommand); 

다른 방법으로, Map'sObject'sList's으로이 문제를 모델링 할 수 있습니다.

개별 주문을 업데이트하거나 추가하거나 삭제하거나 고객 날짜를 변경하려면 전체 목록을 읽고 항목을 변경 한 다음 전체 목록을 다시 작성해야합니다. 잠재적으로 충돌의 기회가 증가합니다 (동일한 키에 대한 동시 업데이트).

Solr은 복잡한 필드 구조, 다중 값 및 동적 필드를 확실히 지원합니다. Creating Search Schemas을보십시오. 귀하의 데이터 중 어떤 부분을 검색 할 수 있는지 알고 싶습니다.

아니요, Riak은 배치 삽입을 지원하지 않습니다.

UPDATE : 귀하의 경우 주문 ID를하여 사용자 정의 색인에 대한 (제네릭이 아닌) SOLR 스키마는

<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" /> 
+0

감사를 포함해야합니다. 개별 주문은 업데이트 할 필요가 없습니다. 그러나 새 주문 항목은 고객 주문 목록에 추가/추가되어야합니다. 각 주문을 orderId로 검색하고 싶습니다. 내가 언급 한 것처럼지도 및 객체의 목록으로 모델링하는 데 관심이 있습니다. Riak에서 이것을 모델링하는 방법에 대해 자세히 설명해 주시겠습니까? – user2208562

+0

같은 문제입니다. 내가 "개별 주문 업데이트"를 쓸 때 나는 추가와 삭제를 의미했다. 구조의 일부인 모든 정보 조각에 대해 동일하게 적용됩니다. 'orderId'로 검색하는 것은 쉽습니다.'orders.orderId'를'string'으로 색인화하고 다중 값으로 만들어야합니다. – vempo

+0

혼란 스럽네요. 데이터를 통합하거나 모델을 별도의 키 - 값 쌍으로 저장 하시겠습니까? 예를 들어, 별도의 고유 키에있는 각 주문과 고객에게 연결된 다른 키에있는 주문 목록. 'Maps'과'Lists'는 Java 클래스를 의미합니다. 어떤 이유로 든 모델을 나타 내기 위해 DTO 클래스를 생성하고 싶지 않은 경우입니다. – vempo