Индексирование объединенных записей в 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" - иначе вы получите только один из зависимых объектов, проиндексированных.

Другие вопросы по тегам