首页 文章

索引在Solr中加入记录

提问于
浏览
0

我是Solr的新手并坚持做一些基本的(我认为),这可能是我缺乏理解/理解 . 我已经阅读了关于DIH的文档,花了很多时间搜索这个问题,却没有找到我的解决方案 .

我的用例是一个消息/电子邮件系统,用户可以互相发送消息并启动一个可以回复的线程(因此它更像是电子邮件,而不是用户群上的直接消息) .

问题很简单;我有一个表 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>

managed-schema

<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>

1 回答

  • 1

    如果您想要在单个字段中显示所有电子邮件,则必须将该字段设置为 multiValued="true" - 否则您只会获得一个索引的从属实体 .

相关问题