lucene ngram tokenizer用于模糊短语匹配

时间:2012-02-21 07:40:38

标签: solr lucene fuzzy-search

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

但我找不到ngram tokenizer作为我的lucene3.4 JAR库的一部分,是否已弃用并替换为其他内容? - 目前我正在使用standardAnalyzer,我在这里获得了不错的结果以获得完全匹配的条款。

我有两个要处理的要求。

我的索引是包含短语“xyz abc pqr”的文档,当我提供查询“abc xyz”~5时,我能够得到结果,但我的要求是获得相同文档的结果,即使我有一个额外的像我在查询中的“abc xyz pqr tst”这样的单词(我理解匹配得分会少一点) - 在短语中使用邻近额外单词不起作用,如果我从查询中删除邻近和双引号“”,我得到了预期的结果(但在那里我得到很多误报,比如仅包含xyz的文档,只有abc等。)

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

我想尝试使用ngram,但不确定它是否会按预期工作。

有什么想法吗?

1 个答案:

答案 0 :(得分: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));
    }

}