Я пытаюсь включить связанный документ (Sitecore - в частности, документ Lucene - это Item
), так что, когда индекс Lucene создает документ для элемента типа A, он будет также включают все свойства из другого объекта B.Запрограммировать документ Lucene с дополнительными полями
Конечным результатом является то, что, когда пользователь ищет данные, найденные на элементе B, пользователь получает удар по элементу A. По сути, я предполагаю, что я пытаюсь «продлить» документ Lucene программно.
Вот мой код. Я расширяю класс индексатора и переопределяю метод, в котором я добавляю поля из элемента B в элемент A (контекстный документ). В моем web.config
я добавил специальный индекс поиска (для скорости отладки) с моим классом искателя базы данных.
public class DatabaseCrawlerExtension : Sitecore.Search.Crawlers.DatabaseCrawler
{
protected override void AddAllFields(Lucene.Net.Documents.Document document, Sitecore.Data.Items.Item item, bool versionSpecific)
{
base.AddAllFields(document, item, versionSpecific);
string fieldName;
if (/* item is of template A */)
{
var targetItems = /* get items based on a property */;
foreach (var additionalIndexItem in targetItems)
{
foreach (var fieldKey in additionalIndexItem.Fields
.Select(f => f.Key)
.Where(fk => !fk.StartsWith("_")))
{
document.Add(base.CreateValueField(fieldKey, additionalIndexItem[fieldKey]));
}
}
}
}
}
Я отлажена этот код и могу видеть, что он попадет в линию, призывающую document.Add
, с правильными данными добавляются. То, что я пробовал по-другому, варьируется между вызовом метода base
первым или последним и пытается использовать метод AddSpecialFields
вместо AddAllFields
. Это не дало никаких дополнительных данных в индексе.
Чтобы отладить/просмотреть индекс, я как восстановил индекс (в Sitecore), так и посмотрел на конечный результат, а также посмотрел непосредственно в сгенерированные файлы индексов с помощью инструмента под названием Luke.
Спасибо за точку Луки и 'Field.Store' - инструмент, однако, довольно сложны в использовании, так что я, как правило, использовать его только для проверки конечного результата – Simeon
я попробую с помощью конструктора на' Field' – Simeon