c# - 以编程方式使用附加字段扩展 Lucene 文档

标签 c# .net lucene sitecore lucene.net

我正在尝试包含一个相关文档(特别是 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/

相关文章:

c# - 从 powerpoint 文件中检索图像名称

c# - 如何让 Hangfire 作业调度程序错开我的 20 分钟间隔作业

c# - 服务器表单中的 ASP.net paypal 表单

c# - 检测控件是否被处置

c# - 在字节 [] 中查找 MBUS 电报

java - 使用 TermQuery 的 Lucene 搜索仅适用于 WhitespaceAnalyzer,但不适用于 StandardAnalyzer

c# - 当使用 WebRole.cs 运行 "OnStart()"中的自定义代码时,推荐的调用 base.OnStart() 的方法是什么?

c# - 将父、子、孙数据存储在内存中

sql-server - 结合 DB 和 Lucene 搜索的最佳实践

hadoop - LUCENE 和 Hadoop