2013-03-28 81 views
2

我正在使用Lucene 4.2,並想知道如何使用wordnet爲此版本的Lucene擴展輸入查詢。基本上,如果我的查詢是像使用wordnet同義詞在Lucene 4.2版本中擴展查詢

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文件包含所有同義詞。

任何示例代碼將不勝感激。

+0

是源於索引的術語? – phani 2013-03-28 15:56:47

+0

是的,索引中的術語使用lucene 4.2的SnowBallFilter版本 – 2013-03-29 06:12:04

回答

6

A SynonymFilter允許您將SynonymnMap定義爲簡單的自定義分析器。

只需重寫Analyzer.createComponents即可創建自定義分析器,並分別在寫入和搜索時將定製版本傳遞給IndexWriter和QueryParser。

有一件事要考慮,你的情況涉及爆炸所有可能的同義詞,這將意味着在Builder.add通過includeOrig爲真。這兩種方式都有好處,可能會考慮哪種方法最能滿足您的需求。


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,一目瞭然。

+0

非常感謝。我多次閱讀你的描述,雖然我理解流程,但我無法將這些東西縫在一起。請問您可以提供一些實施細節,請問哪種方法可以在哪個課程之後致電?我仍然在努力理解如何實現這一點。 – 2013-03-31 02:46:34

+1

我已經在這裏添加了一些細節,但這些都是我已經鏈接到的文檔中說明的所有東西,所以我不知道這是否是您需要的。有什麼特別讓你困惑嗎? – femtoRgon 2013-03-31 18:13:02

+0

感謝您添加這麼多的細節。我仍然在弄清楚如何使用WordNetSynonymParser。你能用這個類來粘貼一段代碼嗎? – 2013-04-18 04:42:33