2009-08-08 100 views
14

使用Lucene處理同義詞(短語)的最佳方法是什麼? 特別是,當我需要執行如下查詢:a或b或c NOT d使用Lucene的同義詞

如何在索引時向每個文檔添加名爲「synonyms」的新字段? 該字段的值將包含所有同義詞的列表。只有當該文檔具有任何同義詞時,纔會將其添加到文檔中。

然後,我會執行一個「OR」搜索查詢,該查詢將在該字段中搜索關鍵字以及其他字段。

這種方法可以適用於任何類型的查詢嗎?

僅供參考, 在我的應用程序中的同義詞是完全自定義的,而不是從英語詞典...即。 「全球金融領袖」也可以是「頂級投資銀行」或「財富500強財務公司」等。

請建議。

謝謝。

回答

11

對Lucene項目名爲「wordnet」有貢獻。根據its documentation

該軟件包使用由WordNet定義的同義詞構建一個存儲它們的Lucene索引,這反過來可以用於查詢擴展。您通常運行一次Syns2Index來構建查詢索引/「數據庫」,然後調用SynExpand.expand(...)來擴展查詢。

它包括它做什麼的樣本:

如果您在查詢中通過 「大狗」,那麼它打印出:

查詢:big adult^0.9 bad^0.9 bighearted^0.9 boastful^0.9 boastfully^0.9 bounteous^0.9 bountiful^0.9 braggy^0.9 crowing^0.9 freehanded^0.9 giving^0.9 grown^0.9 grownup^0.9 handsome^0.9 large^0.9 liberal^0.9 magnanimous^0.9 momentous^0.9 openhanded^0.9 prominent^0.9 swelled^0.9 vainglorious^0.9 vauntingly^0.9 dog andiron^0.9 blackguard^0.9 bounder^0.9 cad^0.9 chase^0.9 click^0.9 detent^0.9 dogtooth^0.9 firedog^0.9 frank^0.9 frankfurter^0.9 frump^0.9 heel^0.9 hotdog^0.9 hound^0.9 pawl^0.9 tag^0.9 tail^0.9 track^0.9 trail^0.9 weenie^0.9 wiener^0.9 wienerwurst^0.9

你看到原來的單詞(「大」和「狗」)沒有附加權重。然而,同義詞有一個權重(0.9),你可以自己配置。

它與Lucene的標準發行版捆綁在「contrib」目錄中。

+0

感謝您的投入亞當...你可以請再次參考我的問題嗎?我現在編輯它。 – 2009-08-09 15:59:22

+1

WordNet模塊就像您一樣構建Lucene索引。它構建的這個索引最終用於擴展查詢。如果您只是簡單地嘗試從WordNet的詞典構建這個索引,我相信您可以很容易地知道它用於索引的字段名稱,並自己添加您自己的自定義條目。 – 2009-08-09 17:57:07

0

我更願意使用輸入的整個短語來運行搜索,並且重新返回比下一系列搜索更重的任何內容。然後,我想遍歷該短語中的每個單詞,然後搜索那些結果得到較低分數的單詞。然後我彙總所有返回的項目的分數,並相應地對結果進行排序。這可能不是這樣做的100%最佳方式......但它在過去對我很有幫助。

1

使用QueryParser.parse()解析輸入查詢字符串後,可以獲取Query對象。

在大多數情況下,頂級查詢是布爾查詢,其子查詢是其子查詢。您可以遞歸地迭代查詢對象。當您擊中TermQuery或PhraseQuery對象時,您可以獲取(子)查詢,並將該查詢對象替換爲由其同伴(如果有)組成的布爾查詢對象。

從本質上講,你正在改變你的原始查詢

a OR b AND c 

(a OR synA) OR (b OR synB1 OR synB2) AND c 

在查詢對象工作確保您只需更換新查詢的查詢的葉節點和不甘示弱具有任意複雜的查詢層次結構。