Solr - вложенный объект с несколькими значениями

88
8

Еще раз..
У меня есть 2 таблицы 'blog' и 'comment'. Блог может содержать n комментариев (блог - 1: n - комментарий). В обновлении я использую следующий выбор для вставки данных в индекс solr:


    <entity name="blog" dataSource="mssqlDatasource" pk="id"
transformer="ClobTransformer"
query="SELECT b.id, b.market, b.title AS blogTitle, b.message AS
blogMessage, c.message AS commentMessage, c.secondColumn
FROM blog b LEFT JOIN comment c ON b.id = c.source_id
AND c.source_type = 'blog'">
<field column="blogMessage" name="blogMessage" clob="true" />
<field column="commentMessage" name="commentMessage" clob="true" />
</entity>

Результат индекса выглядит так:


    <doc>
<str name="id">1</str>
<str name="market">12</str>
<str name="title">blog of title 1</str>
<str name="blogMessage">message of blog 1</str>
<str name="commentMessage">message of comment</str>
<str name="scondColumn">Im the second column from comment</str>
</doc>

<doc>
<str name="id">1</str>
<str name="market">12</str>
<str name="title">blog of title 1</str>
<str name="blogMessage">message of blog 1</str>
<str name="commentMessage">message of comment - Im the second comment</str>
<str name="scondColumn">Im the second column from comment</str>
</doc>


Я бы сказал, что это глупо, потому что у меня слишком много данных индекса в одном блоге, только комментарии разные. Можно ли установить "комментарии" как "сущность" следующим образом:


    <entity name="blog" dataSource="mssqlDatasource" pk="id"
transformer="ClobTransformer"
query="SELECT b.id, b.market, b.title AS blogTitle, b.message AS
blogMessage
FROM blog b">
<field column="blogMessage" name="blogMessage" clob="true" />

<entity name="comment" dataSource="mssqlDatasource" pk="id"
transformer="ClobTransformer"
query="SELECT c.message as commentMessage, c.secondColumn
FROM comment c
WHERE c.source_id = ${blog.id}">
<field column="commentMessage" name="commentMessage" clob="true" />
</entity>
</entity>


Это возможно? Как результат будет выглядеть (не можете проверить его до понедельника)?

спросил(а) 2021-01-25T17:29:51+03:00 4 месяца, 4 недели назад
1
Решение
88

Вы почти там, если хотите заполнить многозначное поле комментариев для каждого документа блога, вы хотите CachedSqlEntityProcessor


Моя склонна выглядеть так же, как это (я оставляю биты трансформатора clob, но вы, очевидно, нуждаетесь в них)


<entity name="blog" 
query="SELECT b.id,
b.market,
b.title AS blogTitle,
b.message AS
blogMessage
FROM blog b">
<entity name="blog_comment"
query="SELECT c.message as commentMessage,
c.secondColumn,
c.blog_id
FROM comment c"
processor="CachedSqlEntityProcessor"
where="blog_id=blog.id"/>
<entity>

Документы должны выглядеть так:


<doc>
<str name="id">1</str>
<str name="market">12</str>
<str name="title">blog of title 1</str>
<str name="blogMessage">message of blog 1</str>
<arr name="commentMessage">
<str>message of comment</str>
<str>message of comment - Im the second comment</str>
</arr>
<arr name="secondColumn">
<str>Im the second column from comment</str>
<str>Im the second column from comment</str>
</arr>
</doc>

Возможно, вы захотите сделать несколько вложенных объектов, которые запрашивают для каждого столбца, если вы хотите избежать повторения значений.

ответил(а) 2021-01-25T17:29:51+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема