SynonymFilter允许您将 SynonymMap 定义为简单的自定义分析器。
您可以通过重写Analyzer.createComponents来创建自定义分析器,并在分别写入和搜索时将自定义版本传递给 IndexWriter 和 QueryParser。
需要考虑的一件事是,您的案例涉及分解所有可能的同义词,这意味着在Builder.add 中将includeOrig 传递给 true 。无论哪种方式都有好处,可能会研究哪种方式最能满足您的需求。
Lucene 的Analyzer
设计易于扩展,可以轻松地为您的特定情况定义格式。上面链接的Analyzer
API 文档提供了一个为您的自定义分析器覆盖 createComponents 方法的示例。
就像是:
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new ClassicTokenizer(Version.LUCENE_40, reader);
TokenStream filter = new StandardFilter(Version.LUCENE_40, source);
filter = new LowerCaseFilter(Version.LUCENE_40,filter);
filter = new SynonymFilter(filter, mySynonymMap, false);
//Whatever other filter you want to add to the chain, being mindful of order.
return new TokenStreamComponents(source, filter);
}
您需要从示例中定义 mySynonymMap,它是一个SynonymnMap
. 通常SynonymMap
应该由SynonymMap.Builder
, 通过add(CharsRef, CharsRef, boolean)
上面链接的方法构建。
SynonymMap.Builder builder = new SynonymMap.Builder(true);
builder.add(new CharsRef("crimson"), new CharsRef("red"), true);
//Be sure the boolean last arg you pass there is the one you want. There are significant tradeoffs here.
//Add as many terms as you like here...
SynonymMap mySynonymMap = builder.build();
还有一个WordNetSynonymParser
,如果你喜欢的话,它看起来只是一个 SynonymMap.Builder 旨在读取特定类型的规范,一目了然。