Индексирование объединенных записей в Solr
Я новичок в 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>
управляемые схемы
<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 ответ
Если вы хотите, чтобы все электронные письма были в одном поле, это поле должно быть установлено как multiValued="true"
- иначе вы получите только один из зависимых объектов, проиндексированных.