2011-11-13 93 views
3

我有一個lucene索引,這些文檔大約有20種不同的語言,並且都在同一個索引中,我有一個字段'lng',我只用一種語言來篩選結果。改進lucene拼寫檢查

基於這個指數,我實現了拼寫檢查器,問題是我從所有語言中得到了無關的建議(如果我用英語搜索,德語建議不是我所需要的)。我的第一個想法是爲每種語言創建一個不同的拼寫檢查索引,並根據查詢語言選擇索引,但我不喜歡這樣,是否可以在拼寫檢查索引中添加額外的列並使用它,還是有更好的方法來做到這一點?

另一個問題是,如何改進搜索查詢中2個或更多個術語的建議,目前我只是爲第一個而做,可以強烈改進以結合使用它們,但我找不到任何樣本,或者可以幫助我解決這個問題的實現。

感謝 阿爾米爾實現兩個不同的站點既Lucene和獅身人面像兩個不同的搜索功能

回答

-2

後,我可以說,斯芬克斯是明顯的贏家。

考慮使用http://sphinxsearch.com/代替lucene。它被craigslist等使用。

他們有一個功能叫做形態預處理器:

# a list of morphology preprocessors to apply 
# optional, default is empty 
# 
# builtin preprocessors are 'none', 'stem_en', 'stem_ru', 'stem_enru', 
# 'soundex', and 'metaphone'; additional preprocessors available from 
# libstemmer are 'libstemmer_XXX', where XXX is algorithm code 
# (see libstemmer_c/libstemmer/modules.txt) 
# 
# morphology = stem_en, stem_ru, soundex 
# morphology = libstemmer_german 
# morphology = libstemmer_sv 
morphology = none 

有很多可用的詞幹,正如你所看到的,德國是其中之一。

UPDATE:

擬訂爲什麼我覺得那個獅身人面像一直是我明顯的贏家。

  • 速度:獅身人面像是快速愚蠢。索引編制和服務搜索查詢。
  • 相關性:雖然很難量化,但我覺得我能夠得到更多的相關結果與獅身人面像相比,我的lucene實現。
  • 對文件系統的依賴:對於lucene,我無法打破對文件系統的依賴。雖然他們是變通方法,比如創建一個RAM磁盤,但我覺得選擇sphinx的「僅在內存中運行」選項會更容易。這對具有多個網絡服務器的網站有影響,向索引添加動態數據,重新索引等。

是的,這些僅僅是意見的觀點。然而,他們是來自嘗試這兩種系統的人的意見。

希望幫助...

+2

我認爲這是一個關於lucene的問題,而不是替代品 –

+0

是的,因爲它是所有其他的反應混亂。 – Homer6

+0

'我可以說獅身人面像是一個明顯的贏家.'請在公共場合詳細分享您的意見/經驗,說明它爲什麼是贏家,這樣人們可以輕鬆地決定選擇文本搜索引擎 –

2

據我所知,這是不可能的「語言」字段添加到拼寫檢查指標。我認爲你需要定義幾個搜索SpellChecker來實現這一點。

編輯:因爲它在查詢結果中查詢的語言也由用戶輸入,那麼我的答案僅限於:定義多個拼寫檢查。至於你添加的第二個問題,我認爲之前已經討論過,例如here

然而,即使有可能,它也沒有解決最大的問題,那就是查詢語言的檢測。對於非常短的消息來說,這是非常不平凡的任務,可以包括縮寫詞,專有名詞和俚語。簡單的基於n-gram的方法可能不準確(例如來自Tika的語言檢測器)。所以我認爲最具挑戰性的部分是如何使用來自語言檢測器和拼寫檢查器的確定性分數以及應該選擇哪個閾值來提供有意義的更正(例如,語言檢測器更喜歡德語,但拼寫檢查器在丹麥語中具有良好匹配...)。

+0

在這種情況下檢測查詢語言是非常簡單的,有一個下拉列表和用戶必須選擇lanuge :) – zebra

+0

對不起,我讀了你的問題後有不同的印象 - 這是不是很平常有這個信息,你避難沒有提到它。 –

+0

你好,你能否給我提供參考資料「這是不可能添加'語言'字段的拼寫檢查指數」如果是的話我會接受是答案和獎勵你的賞金 - 謝謝 – zebra

2

如果你看看SpellChecker.SuggestSimilar源,你可以看到:

BooleanQuery query = new BooleanQuery(); 
    String[] grams; 
    String key; 

    for (int ng = GetMin(lengthWord); ng <= GetMax(lengthWord); ng++) 
    { 
     <...> 
     if (bStart > 0) 
     { 
     Add(query, "start" + ng, grams[0], bStart); // matches start of word 
     } 
     <...> 

I.E.建議搜索只是一堆OR'd布爾查詢。您當然可以修改此代碼,如下所示:

query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")), 
        BooleanClause.Occur.MUST)); 

它只會查找德語的建議。除了擁有多個拼寫檢查程序外,如果不修改代碼,則無法執行此操作。


要處理多個條款,請使用QueryTermExtractor來獲取您的條款數組。對每個人進行拼寫檢查,並進行笛卡爾連接。您可能希望在每個組合上運行查詢,然後根據它們發生的頻率進行排序(如單字拼寫檢查程序的工作方式)。