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

时间:2013-03-28 09:17:27

标签: solr lucene 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文件包含所有同义词。

任何示例代码都将受到高度赞赏。

1 个答案:

答案 0 :(得分:6)

SynonymFilter允许您为简单的自定义分析器定义SynonymnMap

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

有一点需要考虑,你的案例涉及爆炸所有可能的同义词,这意味着在Builder.add中将in​​cludeOrig传递给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通常应由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,旨在一目了然地阅读特定类型的规范。