2012-02-21 106 views
2

我试图通过使用lucene实现模糊短语搜索(匹配拼写错误的单词),通过引用各种博客,我认为尝试模糊短语搜索ngram索引。lucene用于模糊短语匹配的ngram tokenizer

但是我找不到ngram tokenizer作为我的lucene3.4 JAR库的一部分,是不推荐使用,还是用其他东西替换? - 目前我正在使用standardAnalyzer,在这里我可以获得体面的结果以获得完美匹配的条款。

我有以下两个要求来处理。

我的索引有一个带有短语“xyz abc pqr”的文档,当我提供查询“abc xyz”〜5时,我能够得到结果,但是我的要求是为同一个文档获取结果,即使我有一个在我的查询(我明白比赛分数会少一些) - 额外的单词像“abc xyz pqr tst” - 在短语中使用邻近额外单词不起作用,如果我从查询中移除邻近和双引号“”,我期待结果(但是我得到很多误报,比如只包含xyz的文档,只有abc等)

在上面的例子中,如果有人拼错查询“abc xxz”,我仍然想要得到相同文档的结果。

我想用ngram试一试,但不确定它会按预期工作。

有什么想法?

回答

4

尝试使用BooleanQueryFuzzyQuery,如:

public void fuzzysearch(String querystr) throws Exception{ 
     querystr=querystr.toLowerCase(); 

     System.out.println("\n\n-------- Start fuzzysearch -------- "); 

     // 3. search 
     int hitsPerPage = 10; 
     TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true); 
     IndexReader reader = IndexReader.open(index); 

     IndexSearcher searcher = new IndexSearcher(reader); 
     BooleanQuery bq = new BooleanQuery(); 

     String[] searchWords = querystr.split(" ") ; 
     int id=0; 
     for(String word: searchWords){ 
      Query query = new FuzzyQuery(new Term(NAME,word)); 
      if(id==0){ 
       bq.add(query, BooleanClause.Occur.MUST); 
      }else{ 
       bq.add(query, BooleanClause.Occur.SHOULD); 
      } 
      id++; 
     } 
     System.out.println("query ==> " + bq.toString()); 
     searcher.search(bq, collector); 
     parseResults( searcher, collector ) ; 
     searcher.close(); 
    } 

public void parseResults(IndexSearcher searcher, TopScoreDocCollector collector ) throws Exception { 
ScoreDoc[] hits = collector.topDocs().scoreDocs; 

    // 4. display results 
    System.out.println("Found " + hits.length + " hits."); 
    for(int i=0;i<hits.length;++i) { 
     int docId = hits[i].doc; 
     Document d = searcher.doc(docId); 
     System.out.println((i + 1) + ". " + d.get(NAME)); 
    } 

} 
+0

感谢约翰,我会尝试这一点,并让你知道。 – Rushik 2012-02-29 03:39:37