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

Lon*_*guy 2 lucene solr wordnet

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

term_1 AND term_2 OR term_3
Run Code Online (Sandbox Code Playgroud)

我希望它能够扩展为

(term_1 OR term_1syn_1 OR term_1syn_2) AND (term_2 OR term_2syn_1) OR (term_3 OR term_3syn_1)
Run Code Online (Sandbox Code Playgroud)

等等.

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

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

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

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

fem*_*gon 6

一个SynonymFilter允许你定义一个SynonymnMap一个简单的自定义分析.

您可以通过覆盖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);
}
Run Code Online (Sandbox Code Playgroud)

你需要从示例中定义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();
Run Code Online (Sandbox Code Playgroud)

WordNetSynonymParser如果您愿意,还有一个看起来像SynonymMap.Builder的设计用于阅读特定类型的规范,一目了然.