2017-04-10 6 views
0

SQL DIH를 사용하여 DBMS에 저장된 데이터 집합을 Solr을 사용하여 인덱싱합니다. 테이블에있는 하나는 n 대 n 관계를 사용합니다. 단순함을 위해 (내 애플 리케이션은 이것보다 훨씬 더 복잡하다.) 여기 애플리케이션의 예가있다 : 사람은 이름을 갖고 0..n 역할 (role은 role_name 문자열로 기술된다)이 연관되어있다.Solr 다중 값 필드 및 패싯을 사용하는 DIH

Table Person: 
- id: int 
- Name: string 

Table roles 
- id: int 
- role_name: string 

Table association 
- id_person: int 
- id_role: int 

두 사람과 같이 설명 될 수있다 : 나는 SOLR 달성 싶은 것이 여기에

id=1, name=John Doe, roles=[programmer, father, soccer player] 
id=2, name= Eric Smith, roles=[] 

.

  1. 가져 오기 다이 하이드로와 데이터가 (? 중첩 된 SQL 쿼리를 사용하고있을 수 있습니다)
  2. 쿼리 및
  3. 주어진 역할을 사용하여 쿼리 할 수있는 모든 사람이 정보 + 사람의 역할과 데이터를 표시, 예 역할 = 프로그래머가있는 모든 사람을 말해 주시겠습니까?
  4. 모든 역할 목록,

내가이 SOLR 가능한 것으로 예상 전체 데이터 세트 (I 버전 6.4을 사용하고있는 사건의 수와 각 하나를 만들려면 패 시팅을 설정,하지만 난 할 수 최신 6.5로 쉽게 업그레이드). 아무도 그것을 할 방법을 설명하거나 적절한 정보/튜토리얼을 가리킬 수 있습니까?

감사

UMG

+0

두 행 ID가 동일합니까? –

+0

죄송합니다. 오타입니다. 지금 바로 고칠 것입니다! – ugomaria

답변

0

예 그것은 SOLR 가능합니다.

다음
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 
<field name="name" type="string" indexed="false" stored="true"/> 
<field name="roles" type="strings" indexed="true" stored="true"/> 
<field name="cfname" type="text_general" indexed="true" stored="false" multiValued="false"/> 
<copyField source="name" dest="cfname"/> 

역할이 다중 값 필드 :

나는 한 사람 당신은 하나 아래처럼 SOLR 스키마를 만들 수 있습니다 역할
의 큰 숫자가없는 가정합니다.

이제 사람 이름으로 조회 할 수 있습니다 q=cfname:John

http://solr_node:8983/solr/collection_name/select?q=cfname%3AJohn 

그리고 목록 모든 역할의 전체 데이터 세트의 발생 횟수와 각 하나를 : q=*:*, facet=true, facet.field=rolesrows=0

http://solr_node:8983/solr/collection_name/select?q=*%3A*&rows=0&facet=true&facet.field=roles 
0

당신이 고려해야 할 몇 가지 까다로운 것들 :

  1. 당신은 최적의 성능을 위해 다이 하이드로 설정에서

    <field name="roles" type="string" indexed="true" stored="true" multiValued="true"/> 
    
  2. 를 다중으로, 역할을 정의 (이것은 당신 DB가 필요에 따라 수정 않으며, MySQL을위한) 이런 식으로 할 : 그래서 당신은 실행에 가입 왼쪽 단일 쿼리 (훨씬 빠른 사람마다 내부 쿼리를 실행하는 것보다), 및 사용 SQL GROUP BY 및 변압기는 다중 값 필드에 역할을 마사지하는이 최적의 인덱스 반환 한에 대한 대부분이다

    <entity name="person" pk="id" transformer="RegexTransformer" query=" 
        SELECT p.id... GROUP_CONCAT(DISTINCT COALESCE(r.name,'') SEPARATOR '|') AS roles FROM person p LEFT JOIN association a ON p.id_person = a.id_role LEFT JOIN roles r ON a.id_role=r.id 
        WHERE ... 
        GROUP BY p.id, ... 
         "> 
        <field column="roles" name="roles" splitBy="\|"/> 
    </entity> 
    

. 색인을 생성하면 실행하려는 쿼리는 매우 기본입니다.

위의 conf는 손으로 쓴 것으로 테스트되지 않았으며 일부 오타가있을 수 있지만 그 요점을 알기를 바랍니다.