在Lucene 4.2版本中使用wordnet同义词展开查询



我正在使用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文件中有所有的同义词。

SynonymFilter允许您定义一个SynonymnMap到一个简单的自定义分析器。

你可以通过覆盖Analyzer来创建一个自定义的Analyzer。当分别写入和搜索时,将自定义版本传递给IndexWriter和QueryParser。

需要考虑的一件事是,您的情况涉及到爆炸所有可能的同义词,这将意味着在Builder.add中传递includeorigin为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,它是一个SynonymnMapSynonymMap通常应该通过上面链接的add(CharsRef, CharsRef, boolean)方法由SynonymMap.Builder构建。

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。

最新更新