【发布时间】:2011-02-02 07:17:03
【问题描述】:
我们正在使用 Lucene 作为 sitecore 的一部分进行文本搜索。 有什么方法可以忽略站点核心搜索中的停用词(如 a,an,the...)?
【问题讨论】:
-
这个有什么用例?如果您搜索 the cat in the hat,您是否希望它真的像您输入 cat hat 一样进行搜索?还是您的意思是在结果中过滤掉它们?
我们正在使用 Lucene 作为 sitecore 的一部分进行文本搜索。 有什么方法可以忽略站点核心搜索中的停用词(如 a,an,the...)?
【问题讨论】:
默认情况下,Sitecore 使用 Lucene 标准分析器 - Lucene.Net.Analysis.Standard.StandardAnalyzer。您可以看到这是在 web.config 文件的 /configuration/sitecore/search/analyzer 元素中定义的。 StandardAnalyzer 类的构造函数之一接受它将考虑停用词的字符串数组。默认情况下,它使用硬编码的停用词列表,其中包括:
“a”、“an”、“and”、“are”、“as”、“at”、 “是”、“但是”、“由”、“为”、“如果”、“在”、 “进入”、“是”、“它”、“不”、“不是”、“属于”、 “在”、“或”、“这样”、“那个”、“该”、 “他们的”、“那么”、“那里”、“这些”、 “他们”、“这个”、“到”、“曾经”、“将”、 “与”
如果您想覆盖此行为,我认为您应该继承 StandardAnalyzer 并覆盖其默认构造函数,以从另一个来源而不是硬编码数组中获取停用词。您有多种选择,甚至可以从文本文件中读取。不要忘记在 web.config 中用你的标准类替换标准类。
请参阅StandardAnalyzer 类的其他构造函数以获取更多详细信息。 .NET Reflector 是你这里的朋友。
【讨论】:
Yans 帖子的示例:
public class CaseAnalyzer : Lucene.Net.Analysis.Standard.StandardAnalyzer
{
private static Hashtable stopWords = new Hashtable(); //{{"by","by"}}; <-- Makes "by" a stopword that will not be matched in analyzer
public CaseAnalyzer() : base(Lucene.Net.Util.Version.LUCENE_29, stopWords)
{
}
}
这应该在
下的 web.config 中注册/configuration/sitecore/search/analyzer
分析器注册示例
<caseanalyzer type="EBF.Business.Search.Analyzers.CaseAnalyzer, EBF.Business, Version=1.0.0.0, Culture=neutral"/>
最后你只需要像这样在搜索配置中注册你的分析器
<Analyzer ref="search/caseanalyzer" />
【讨论】: