2017-10-17 80 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

我認爲你在導入實體結構時會感到困惑 - 結果是_single document_。由於'html'是單值,因此只會插入一個值。如果您將其設置爲多值,它將包含與該線程關聯的每個郵件。如果你想在一個線程中爲每個郵件創建一個文檔,那麼你可能也希望與html進行連接,並且爲每個郵件獲得一個文檔和其元數據。 – MatsLindh

回答

1

如果你想在一個字段中的所有電子郵件,該字段必須設置爲multiValued="true" - 否則你只會得到索引的一個依賴實體。