2

我正在使用 Lucene 4.2,想知道如何使用 wordnet 来扩展此版本 Lucene 的输入查询。基本上,如果我的查询是

term_1 AND term_2 OR term_3

我希望它被扩展为

(term_1 OR term_1syn_1 OR term_1syn_2) AND (term_2 OR term_2syn_1) OR (term_3 OR term_3syn_1)

等等。

我在 StackoverFlow 上查看了此类问题的其他答案,但没有一个有任何示例实现。

给定一个字符串形式的输入查询,我如何使用 WordNetQueryParser 和 SynonymMap 类来扩展它?

我已经下载了 wordnet prolog 文件,并且我知道 _s.pl 文件包含所有同义词。

任何示例代码将不胜感激。

4

1 回答 1

6

SynonymFilter允许您将 SynonymMap 定义为简单的自定义分析器。

您可以通过重写Analyzer.createComponents来创建自定义分析器,并在分别写入和搜索时将自定义版本传递给 IndexWriter 和 QueryParser。

需要考虑的一件事是,您的案例涉及分解所有可能的同义词,这意味着在Builder.add 中将includeOrig 传递给 true 。无论哪种方式都有好处,可能会研究哪种方式最能满足您的需求。


Lucene 的Analyzer设计易于扩展,可以轻松地为您的特定情况定义格式。上面链接的AnalyzerAPI 文档提供了一个为您的自定义分析器覆盖 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 旨在读取特定类型的规范,一目了然。

于 2013-03-28T16:30:35.040 回答