2017-10-17 11 views
0

저는 Solr을 처음 접해 보았습니다. 제 생각으로는 이해/이해가 부족한 기초 지식을 고수했습니다. DIH에 대한 설명서를 읽었으며 솔루션을 찾지 않고이 문제를 검색하는 데 많은 시간을 소비했습니다.Solr에서 레코드를 인덱싱하는 중

내 유스 케이스는 사용자가 서로에게 메시지를 보내고 대화 할 수있는 스레드를 시작할 수있는 메시징/이메일 시스템입니다 (사용자 기반의 직접 메시지보다 전자 메일에 가깝습니다).

질문은 간단합니다. 하나의 테이블, threads이 있습니다.이 테이블은 사용자 정보와 주제와 같은 검색 가능한 데이터를 포함하고 있습니다. 그런 다음 emails 테이블에서 조인하고 html 열을 검색 할 수 있습니다.

Solr에서 아래의 콜렉션을 실행하고 검색을 수행하면 스레드에 대한 하나의 email만을 검색하여 원하는대로 검색 할 수 있습니다. 해당 스레드에 속한 모든 전자 메일을 가져옵니다. 그래서 내가 10 스레드지만, 100 메시지, Fetched: 100,하지만 Processed: 10 말합니다.

어떻게하면 Solr이 모든 콘텐츠를 올바르게 색인화하고 검색 할 수 있습니까? 이 특정 사용 사례에서는 메시지를 먼저 가져온 다음 그 스레드가 속한 스레드를 제거한 다음 결과를 어느 정도 적용하는 반전 된 예제를 만들었지 만 다음 단계는 left join이 있다는 것입니다. 이메일 첨부 파일 용. 따라서이 설정으로 솔루션을 찾고 있습니다. SOLR를 사용

6.6

<dataConfig> 
    <dataSource name="ds-db" type="JdbcDataSource" 
       driver="com.mysql.jdbc.Driver" 
       url="${dataimporter.request.url}" 
       user="${dataimporter.request.user}" 
       password="${dataimporter.request.password}"/> 
    <document name="threads"> 
     <entity name="thread" dataSource="ds-db" 
       query=" 
      SELECT threads.id 
       , threads.user_id 
       , threads.subject 
       , users.first_name 
       , users.last_name 
       , users.email 
       FROM threads 
     LEFT JOIN users ON users.user_id=threads.user_id 
      "> 
      <field column="id" name="thread_id"/> 
      <field column="user_id" name="user_id"/> 
      <field column="subject" name="subject"/> 
      <field column="first_name" name="first_name"/> 
      <field column="last_name" name="last_name"/> 
      <field column="email" name="email"/> 

      <entity name="message" dataSource="ds-db" transformer="HTMLStripTransformer" 
        query=" 
       SELECT id 
        , html 
        FROM emails 
       WHERE thread_id = ${thread.id} 
        "> 
       <field column="id" name="id"/> 
       <field column="html" name="html" stripHTML="true"/> 


      </entity> 

     </entity> 
    </document> 
</dataConfig> 

관리 스키마

<schema name="example-data-driven-schema" version="1.6"> 
    ... 
    <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 
    <field name="thread_id" type="string" multiValued="false" indexed="true" required="true" stored="true"/> 
    <field name="first_name" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="last_name" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="email" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="subject" type="string_lowercase" indexed="true" stored="true"/> 
    <field name="html" type="string_lowercase" indexed="true" stored="true"/> 
    ... 
    <copyField source="first_name" dest="_text_"/> 
    <copyField source="last_name" dest="_text_"/> 
    <copyField source="email" dest="_text_"/> 
    <copyField source="subject" dest="_text_"/> 
    <copyField source="html" dest="_text_"/> 
    ... 
</schema> 
+0

필드 'html'의 정의와 스키마의 유형은 무엇입니까? – MatsLindh

+0

@MatsLindh'managed-schema'의 스 니펫으로 질문을 업데이트했습니다. 이게 네가 원하는거야? – Richard

+0

당신이 가져올 때 엔티티 구조가 어떻게 혼란 스럽습니까? 결과는 단일 문서 _입니다. 'html'은 단일 값이므로 하나의 값만 삽입됩니다. multiValued로 설정하면 스레드와 관련된 모든 메일이 포함됩니다. 쓰레드에서 하나의 메일에 대해 하나의 문서를 원한다면, html과 조인을하고 메타 데이터가있는 메일 당 하나의 문서를 얻고 싶을 것입니다. – MatsLindh

답변

1

단일 필드에있는 모든 전자 우편을 원하는 경우, 해당 필드는 multiValued="true"로 설정해야합니다 - 그렇지 않으면 당신을 종속 엔티티 중 하나만 인덱싱됩니다.