У меня проблема с SOLR. Основная мотивация сделать то, что я опишу позже, заключалась в том, чтобы удалить нагрузку из базы данных в SOLR. Мы говорим о интернет-магазине, в котором хранятся тонны продуктов, и где статистические c данные (иногда вычисляемые с помощью довольно «дорогих» SQL запросов) должны храниться в SOLR.
Версия SOLR: 8.2
На самом деле это не проблема с общими полями, такими как название продукта, код продукта и c .. Проблемы начались, когда я хотел перенести 1: N отношения (например product_tag - вы можете представить что-то вроде NEW, PRETTY COOL, ... - где я хочу сохранить некоторые поля - id, имя тега и некоторые логические значения)
<entity name="product_tag"
child="true"
query="SELECT l.id, l.text as tag, l.eshop_relevant, sipt.stock_item_id as stock_item_id FROM product_tag l join stock_item_product_tag sipt on sipt.product_tag_id = l.id"
cacheImpl="SortedMapBackedCache"
where="stock_item_id=stock_item.id">
<field name="id" column="id" />
<field name="text" column="tag" />
<field name="eshop_relevant" column="eshop_relevant" />
Ядро, которое я хочу для расширения выглядит так (некоторые поля были удалены для простоты)
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="xxx" version="1.6">
<xi:include href="common-types.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="id" type="long" indexed="true" stored="true" />
<field name="code" type="string" indexed="true" stored="true" required="true"/>
<uniqueKey>code</uniqueKey>
</schema>
Как видите, главное - это код. Типичное использование - некоторый BE Spring API будет вызывать клиента SOLR с запросом продуктов с кодами 1,2,3,4,5, и SOLR должен предоставить ему все документы, соответствующие данным кодам.
Я попытался улучшить документ с этими полями
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" multiValued="true" />
<field name="product_tag_id" type="long" indexed="true" stored="true" />
<field name="product_tag_name" type="string" indexed="false" stored="true" />
<field name="eshop_relevant" type="boolean" indexed="false" stored="true" />
Чтобы охватить отношение 1: N с тегом продукта (чтобы продукт содержал «массив» тегов продукта, каждый из которых содержит свой идентификатор, назовите логическое значение eshop_relevant).
Результат не работает. Результат довольно беспорядочный , иногда он импортирует один продукт дважды (так что есть 2 документа с одинаковым кодом), а
«первый» продукт имеет
- product_tag.product_tag_id: «22» (его строка и никакое другое поле, связанное с тегом продукта)
у «второго» продукта
Я пробовал много возможностей, гуглил целую вечность (даже пробовал все потоки SO, соответствующие вложенным объектам на SOLR), пробовал какую-то онлайн-книгу о solr, и ничего не произошло.