在 Solr 中索引连接记录
Indexing joined records in Solr
我是 Solr 的新手并且停留在一些基本的东西上(我认为),这可能是我缺乏 understanding/comprehension 的原因。我已经阅读了关于 DIH 的文档并花了很多时间搜索这个问题,但没有找到我的解决方案。
我的用例是一个 messaging/email 系统,用户可以在其中互相发送消息并启动一个线程,他们可以回复该线程(因此它更像是电子邮件,而不是针对用户群的直接消息)。
问题很简单;我有一个 table、threads
,这是它的基础,包含用户信息和主题等可搜索数据。然后加入 emails
table,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>
如果您希望所有电子邮件都在一个字段中,则该字段必须设置为 multiValued="true"
- 否则您只会获得一个相关实体的索引。
我是 Solr 的新手并且停留在一些基本的东西上(我认为),这可能是我缺乏 understanding/comprehension 的原因。我已经阅读了关于 DIH 的文档并花了很多时间搜索这个问题,但没有找到我的解决方案。
我的用例是一个 messaging/email 系统,用户可以在其中互相发送消息并启动一个线程,他们可以回复该线程(因此它更像是电子邮件,而不是针对用户群的直接消息)。
问题很简单;我有一个 table、threads
,这是它的基础,包含用户信息和主题等可搜索数据。然后加入 emails
table,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>
如果您希望所有电子邮件都在一个字段中,则该字段必须设置为 multiValued="true"
- 否则您只会获得一个相关实体的索引。