1

我们正在使用 Umbraco,它有一个基于 Lucene 的内置搜索系统。

网站上的每个文档都包含一个标签列表,这些标签由 Luence 索引并保存为包含 CSV 格式标签的单个字段。

例如:

Red,Green,Blue

但是,当我们通过 Umbraco(也使用Luke)搜索该字段时,我们没有得到正确的行为。

搜索“红色”有效,但搜索“绿色”或“蓝色”无效。

根据我对 Lucene 的理解,这完全是由于分析器不理解 CSV 格式。分析器需要使用逗号进行标记以分解为标记。

但是,我不知道如何实现这一目标。

看来这一定是一个常见问题,所以我一定遗漏了一些非常明显的东西。

4

2 回答 2

0

你是正确的,CSV 不适用于 Lucene。正如Umbraco 论坛上所讨论的,您需要将一个函数绑定到GatheringNodeDataExamine 事件,它允许您进行自定义索引。

您可以使用此函数以空格而不是逗号分隔 CSV 字段,将此数据作为新索引字段插入,并将其包含在<IndexUserFields>ExamIndex.config 的部分中

public class ExamineEvents : IApplicationStartupHandler
{
    public ExamineEvents()
    {
        ExamineManager.Instance.IndexProviderCollection[INDEX_NAME].GatheringNodeData
         += ExamineEventsGatheringNodeData;
    }

    void ExamineEventsGatheringNodeData(object sender, IndexingNodeDataEventArgs e)
    {
        if (e.IndexType == IndexTypes.Content)
        {
            var node = new Node(e.NodeId);                
            IndexCsv(e, node);                
        }
    }

    private void IndexCsv(IndexingNodeDataEventArgs e, Node node)
    {
        if (node.NodeTypeAlias == "CsvPropertyDocType" &&
           !string.isNullOrEmpty(node.GetPropertyValue("CsvProperty")))
        {
            e.Fields.Add("CsvFieldSearchable", node.GetPropertyValue("CsvProperty").Replace(","," "));
        }
    }
}

其中CsvProperty是 CSV 属性 CsvPropertyDocType的名称,是包含该属性的文档类型的名称,并且INDEX_NAME是您的检查索引名称。

于 2013-08-23T15:40:42.000 回答
0

我最近刚刚建立了一个 Umbraco 6.1.3 站点,正是这样做的。标签被添加到以逗号分隔格式索引的文档类型的“标签”属性中。

Umbraco 站点具有所有默认索引设置,因此没有任何修改。

当我在 Luke 打开“外部”内容索引时,我可以看到“标签”字段已被索引、存储和标记化(除其他外),并且按预期存储了值:

在此处输入图像描述

tags:lorem如果我使用or在 Luke 中搜索tags:ipsum,两者都会返回正确的结果。

如果您的标签字段没有被标记,那么我会检查您正在使用的分析器。Lucene.Net.Analysis.Standard.StandardAnalyzer更可取,因为它将考虑到这一点。我相当肯定WhitespaceAnalyzer不会。

或者,您可以在“索引”事件中拦截 Umbraco 文档,创建一个名为“tags_mod”的新 Lucene 字段并添加tags.Replace(",", ", "). 这样,它们应该被正确索引。您当然必须搜索“tags_mod”而不是“tags”。这感觉有点hacky但完全有效。这是将文本内容组合到单个可索引字段的好方法,例如,如果多个字段都具有相同的偏差,并且不需要单独索引、标记和存储它们。

于 2013-08-23T15:15:27.487 回答