import org.apache.lucene.search.spell.SpellChecker;
SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
// To index a field of a user index:
spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
// To index a file containing words:
spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);
4条答案
按热度按时间4dc9hkyq1#
您应该查看contrib目录中的SpellChecker模块,它是Java lucene的SpellChecker模块的一个端口,因此它的documentation应该会有帮助。
(From javadocs:)
示例用法:
lndjwyie2#
AFAIK Lucene支持邻近搜索,这意味着如果您使用类似于以下内容的代码:
磁场:振幅~0.5
(it是波浪号)
将匹配“string”。浮点数是搜索的“容忍度”,其中1. 0是完全匹配,0. 0是匹配所有内容(排序)。
然而,不同的解析器将以不同的方式实现这一点。
近似搜索比模糊搜索(stri*)要慢得多,所以要谨慎使用。在您的例子中,如果您在常规搜索中没有找到匹配项,您可以尝试使用近似搜索来查看您找到了什么,并以某种方式根据结果显示“您的意思是什么”。
出于性能原因,对于非常常见的错误拼写,缓存此类查找可能会很有用。
wooyq4lh3#
谷歌的“你的意思是?”是(可能;当然,它们是保密的)通过查询它们的查询日志来实现的。查看搜索您正在处理的查询的人是否很快搜索到了非常相似的内容;如果是的话,这表明他们犯了一个错误,并意识到他们应该寻找什么。
因为你可能没有一个庞大的查询日志,所以你可以把它近似化,取查询,把搜索词分开,看看数据库中是否有相似的搜索词(通过编辑距离,无论什么);将您的搜索词替换为附近的搜索词,然后重新运行查询。如果获得更多匹配项,则该查询可能是更好的查询。向用户推荐该查询。(由于您已经获得了匹配项,而大多数人只查看前两个结果,因此请向他们显示这些结果。)
tjrkku2a4#
看看google code项目semanticvectors,在Lucene邮件列表上有相当多的讨论,讨论的功能就像你在使用它a-不管它是用java写的。
您可能需要解析和使用一些机器学习算法对您的搜索日志来建立这样的功能!