저는 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>
필드 'html'의 정의와 스키마의 유형은 무엇입니까? – MatsLindh
@MatsLindh'managed-schema'의 스 니펫으로 질문을 업데이트했습니다. 이게 네가 원하는거야? – Richard
당신이 가져올 때 엔티티 구조가 어떻게 혼란 스럽습니까? 결과는 단일 문서 _입니다. 'html'은 단일 값이므로 하나의 값만 삽입됩니다. multiValued로 설정하면 스레드와 관련된 모든 메일이 포함됩니다. 쓰레드에서 하나의 메일에 대해 하나의 문서를 원한다면, html과 조인을하고 메타 데이터가있는 메일 당 하나의 문서를 얻고 싶을 것입니다. – MatsLindh