我正在尝试包含一个相关文档(特别是 Sitecore,Lucene 文档是一个 Item
),这样当 Lucene 索引为 A 类型的项目创建文档时,它也会包括另一个项目 B 的所有属性。
最终结果是,当用户搜索在项目 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 的工具直接查看生成的索引文件。 .
最佳答案
这只是一个猜测,但您可以尝试自己创建一个新的 Lucene.Net.Documents.Field
并添加它,而不是使用 base.CreateValueField()
到文档。如果你想用Luke查看索引中的值,一定要在Field上将Store
设置为Field.Store.YES
,否则,该值将被索引,但不存储在索引中。
关于c# - 以编程方式使用附加字段扩展 Lucene 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303367/