Google的“您是不是要”功能
在上一篇文章中對Lucene進行了介紹之后 ,現在是時候提高它,創建一個更復雜的應用程序了。 您肯定最熟悉Google的“您是不是要”功能(其他搜索引擎也支持此功能)。 這是一個例子:

Lucene SpellChecker子項目
可以使用Lucene項目在Java中實現此功能,本教程將向您展示如何使用。 該實現將基于Lucene的子項目之一,即SpellChecker(請參閱拼寫檢查器API )。 這篇文章的靈感來自于我在InfoQ上讀到的一篇最近的文章,名為“ 在Java中實現Google的“您的意思”功能 ”。 作者簡短描述了所使用的編輯距離算法,然后提供了一個簡單的代碼示例。 我還找到了一篇類似的文章,標題為“ 您的意思是:Lucene嗎? ”,但這是在2005年寫的,所以我想它現在已經過時了。 首先查看這些內容,然后再采取一些措施是一個好主意。
尋找基礎字典
在本教程中,將使用英語詞典文本文件。 您可以對此進行簡單搜索 ,也可以直接下載此壓縮文件 。 該文件非常簡單,僅包含用行分隔的單詞。 提取的文件名為“ fulldictionary00.txt”。
使用Lucene SpellChecker API
讓我們開始創建一個新的Eclipse項目(可能名為“ LuceneSuggestionsProject”),然后導入必要的JAR文件。 除了主要的JAR lucene-core-3.0.1.jar外,我們還需要lucene-spellchecker-3.0.1.jar。 這可以在解壓縮的tarball文件夾“ lucene-3.0.1 \ contrib \ spellchecker”中找到。 如果您不知道如何查找發行版以及如何開始該項目,請查看我以前的文章( 全文搜索Apache Lucene簡介 )。 創建一個名為“ SimpleSuggestionService”的新類,并確保包含一個主要方法。 此類的源代碼如下:
package com.javacodegeeks.lucene.spellcheck;import java.io.File;import org.apache.lucene.search.spell.PlainTextDictionary;
import org.apache.lucene.search.spell.SpellChecker;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;public class SimpleSuggestionService {public static void main(String[] args) throws Exception {File dir = new File("c:/spellchecker/");Directory directory = FSDirectory.open(dir);SpellChecker spellChecker = new SpellChecker(directory);spellChecker.indexDictionary(new PlainTextDictionary(new File("c:/fulldictionary00.txt")));String wordForSuggestions = "hwllo";int suggestionsNumber = 5;String[] suggestions = spellChecker.suggestSimilar(wordForSuggestions, suggestionsNumber);if (suggestions!=null && suggestions.length>0) {for (String word : suggestions) {System.out.println("Did you mean:" + word);}}else {System.out.println("No suggestions found for word:"+wordForSuggestions);}}}
是的,就是這么簡單。 如果運行應用程序(使用“ hwllo”作為輸入字),將出現以下輸出:
解釋SpellChecker API
該代碼非常簡單,但是我將詳細介紹一些類。 首先,您需要一個Directory ,它是文件的平面列表。 此類是抽象的,因此我們將FSDirectory用作實際實現。 FSDirectory將索引文件存儲在文件系統中(為了評估訪問速度更快的RAMDirectory ,它是駐留在內存中的實現,應該進行評估)。 下一步是創建一個SpellChecker實例,這是我們應用程序的核心。 請注意,默認的StringDistance是LevensteinDistance 。 如果您希望使用其他算法( JaroWinklerDistance或NGramDistance ),則可以使用setStringDistance方法。 接下來,我們實例化一個PlainTextDictionary ,它指向我們下載的文本文件。 將字典編入索引,然后使用SpellChecker對象檢索拼寫錯誤的單詞的建議單詞。
我想您現在準備創建下一個大型搜索引擎。 您可以在此處找到相關的Eclipse項目。
請享用!
- 全文搜索Apache Lucene簡介
- 使用Spring AspectJ和Maven進行面向方面的編程
- 調度Java應用程序中的主體
- 依賴注入–手動方式
翻譯自: https://www.javacodegeeks.com/2010/05/did-you-mean-feature-lucene-spell.html