2017-10-17 112 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" - 否则你只会得到索引的一个依赖实体。