试图在java中实现Google的“你的意思”功能

时间:2012-11-14 10:40:36

标签: java lucene

我正在尝试在java中实现谷歌的“你的意思”功能。 我在互联网上发现一些代码说它工作正常,但是在尝试运行它时会出现错误。我认为它与目录创建有关,这是我不完全理解的代码的唯一部分。

这是代码,你能给我一些关于错误的帮助吗? 提前谢谢!

             public static void main(String[] args) throws Exception {
             File dir = new File("C:/Users/Lala");
             Directory directory = FSDirectory.open(dir);

             SpellChecker spellChecker = new SpellChecker(directory);

             spellChecker.indexDictionary(
             new PlainTextDictionary(new File("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);
             }

         }

文件fulldictionary00.txt是一个格式正确的纯文本文件。

我得到的错误是在第18行:

SpellChecker spellChecker = new SpellChecker(directory);

因此它与目录创建有关。我正在粘贴我得到的错误以防万一你知道任何想法。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/lucene/document/Fieldable at did_you_mean.main(did_you_mean.java:18) Caused by:     
 java.lang.ClassNotFoundException: org.apache.lucene.document.Fieldable 

3 个答案:

答案 0 :(得分:1)

好吧,在lucene 4.0.0中,spellchecker放在一个名为lucene-suggest-4.0.0.jar的包中,而不是lucene-spellchecker-XXX.jar

答案 1 :(得分:0)

修改

根据OP评论,错误是Lucene的JAR文件似乎不在类路径上......

原始答案,在不知道错误的情况下(将其保留在此处可能有用)

您必须将内容添加到指定的文件中...如果没有它,它将无效。只是做一些思考:程序应该如何知道哪些单词是正确的,哪些单词不正确?

对于纯文字词典文件的情况,您应该使用 PlainTextDictionary

  

由文本文件表示的字典。

     

允许格式:每行1个字:
  字1
  WORD2
  WORD3

This page在Lucene索引的上下文中解释了一下:

  

导入:在词典中添加单词   我们可以添加来自Lucene索引(更确切地说来自一组Lucene字段)的单词,以及来自带有单词列表的文本文件。

     

示例:我们可以添加索引的给定Lucene字段的所有关键字。

SpellChecker spell= new SpellChecker(dictionaryDirectory);
spell.indexDictionary(new LuceneDictionary(my_luceneReader,my_fieldname));

答案 2 :(得分:0)

如果其他人遇到同样的问题,我找到了解决问题的方法!

首先,问题似乎是lucene的4.0.0版本,我下载的版本,因为一个jar文件类正在调用另一个已在此版本中重命名的jar文件中的类。 / p>

要修复问题,我刚刚下载了旧版本(3.6.1),这需要对现有代码进行一些更改。在这个版本中,spellChecker.IndexDictionary()函数需要3个参数:

spellChecker.indexDictionary(new PlainTextDictionary(new File("fulldictionary00.txt")),config,false);

config是一个IndexWriterConfig对象。

我希望这能帮助有同样问题的人! @ppeterka无论如何都要感谢你的帮助!