Решите запрос вложенных документов с помощью ChildDocTransformerFactory, получите "Родительский запрос дает документ, который не соответствует родительскому фильтру"
Немного предыстории:
- Используемые данные представляют собой данные каталога с тремя вложенными объектами: Продукты, Предметы и Skus в указанном порядке. У нас есть поле docType для каждой записи в качестве дифференциатора.
- Поле "id" в наших данных уникально для каждого типа данных, но не для разных типов данных. Мы добавили поле "uuid" в нашу программу, которое генерирует файл импорта Solr, который является идентификатором с префиксом первой буквы docType, например, P12345. Это делает поле uuid уникальным, и мы имеем это как uniqueKey в нашем schema.xml.
- Мы пытаемся получить родительский продукт и все дочерние документы. Таким образом, мы используем ChildDocTransformerFactory ([child...]) для извлечения потомков вместе с родителем. Мы еще не решили проблему получения элементов в SKU в качестве вложенных документов в результатах, и нам придется это выяснить в какой-то момент, но пока мы их выравниваем
- Мы создаем доказательство концепции для этого. Это все новая работа, поэтому мы можем многое изменить.
- Это Solr 6.0.0, и мы импортируем в формате JSON, если это имеет значение
Наши данные выглядят так (я удалил некоторые поля для простоты):
{
"id": 739063,
"docType": "Product",
"uuid": "P739063",
"_childDocuments_": [
{
"id": 1537378,
"price": 25.45,
"color": "Blush",
"docType": "Item",
"productId": 739063,
"uuid": "I1537378",
"_childDocuments_": [
{
"id": 12799578,
"size": "10",
"width": "W",
"docType": "Sku",
"itemId": 1537378,
"uuid": "S12799578"
}
]
}
}
Запрос на выборку всех Продуктов и их дочерних элементов, вложенных в них: q = docType:Product & fl = title, id, docType, [child parentFilter = docType:Product]. Когда я запускаю этот запрос, все хорошо, и он возвращает первые 10 строк. Однако, если я получу больше строк, добавив, скажем, &row = 500, мы получим ошибку. Родительский запрос дает документ, который не соответствует родительскому фильтру, docID = XXX.
Когда мы впервые увидели эту ошибку, мы обнаружили, что наше поле id не было уникальным для разных типов документов, поэтому мы добавили поле uuid, как упомянуто выше, то есть. мы также добавили в нашем файле schema.xml, стер ядро, пересоздал его и перезапустил Solr, чтобы убедиться, что он работает. Мы дважды проверили и уверены, что поля uuid уникальны.
Во всех результатах поиска по той ошибке, которую я обнаружил, у OP не было поля, которое могло бы дифференцировать различные типы документов, но, как вы видите, мы делаем. Поскольку и запрос, и parentFilter ищут docType:Product, я не вижу, как любой из них мог бы вернуть что-либо, кроме родителей. Мы также попытались добавить childFilter=docType:Item и childFilter=docType:Sku, но это не помогло. И я также попытался использовать title:* для запроса и parentFilter, поскольку заголовки есть только у продуктов.
Есть ли что-нибудь еще, что мы можем попробовать?
Любое объяснение этого?
Возможно ли, что он не использует uuid в качестве уникального идентификатора, даже если он указан в schema.xml, и может ли это даже вызвать это?
Благодарю.
1 ответ
Оказалось, что мы даже не использовали schema.xml, потому что solrconfig.xml был настроен для управляемой схемы. К сожалению.
Большая часть документации предполагает, что вы используете без схемы, и даже не вдавался в детали, поэтому я пропустил это.