【问题标题】:How to use Lucene to query a CSV field如何使用 Lucene 查询 CSV 字段
【发布时间】:2013-08-23 10:43:19
【问题描述】:

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

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

例如:

Red,Green,Blue

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

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

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

但是我不知道如何实现这一点。

这似乎是一个普遍的问题,所以我一定遗漏了一些非常明显的东西。

【问题讨论】:

  • 您是否使用 Examine 作为搜索索引?
  • 是的 - 但正如我所说,我已经通过 Examine 和 Luke 进行了搜索

标签: csv lucene umbraco


【解决方案1】:

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

Umbraco 网站具有所有默认索引设置,因此无需修改任何内容。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    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 是您的检查索引名称。

    【讨论】:

    • 不确定 Lucene 不能分析 CSV 格式,我的例子证明它可以——或者至少 Examine 的实现可以。这取决于使用的分析器。
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多