2

我正在使用 Lucene 来索引我的数据库,然后对特定字段(字段名称:关键字)执行短语搜索。我目前正在使用以下代码:

        String userQuery = request.getParameter("query");
        //create standard analyzer object
        analyzer = new StandardAnalyzer(Version.LUCENE_30);
                    Analyzer analyze=AnalyzerUtil.getPorterStemmerAnalyzer(analyzer);
        //create File object of our index directory
        File file = new File(LUCENE_INDEX_DIRECTORY);
        //create index reader object
        reader = IndexReader.open(FSDirectory.open(file),true);
        //create index searcher object
        searcher = new IndexSearcher(reader);
        //create topscore document collector
        collector = TopScoreDocCollector.create(1000, false);
        //create query parser object
        parser = new QueryParser(Version.LUCENE_30,"keyword", analyze);
                    parser.setAllowLeadingWildcard(true);
        //parse the query and get reference to Query object
        query = parser.parse(userQuery);
        //********Line 1***********************
                    //search the query
        searcher.search(query, collector);
        hits = collector.topDocs().scoreDocs;
        //check whether the search returns any result
        if(hits.length>0){//Code to retrieve hits}

这段代码适用于词干提取,但现在我还想扩展我的查询以进行同义词搜索,比如如果我输入“Man”并且我的 lucene 索引有一个条目“male”,它仍然可以给我一个打击. 我试图在上面代码的第 1 行添加它, 但它没有给我任何结果。我还想介绍拼写检查,如果我输入“难以置信”而不是“难以置信”,它仍然会给我一个结果。query=SynExpand.expand(userQuery,
searcher, analyze,"keyword",serialVersionUID);

我不知道为什么同义词扩展对我不起作用以及如何进行拼写检查。如果有人可以指导我,我将非常感激。

谢谢!

4

1 回答 1

4

模糊搜索可以通过查询关键字修饰符来完成,即添加波浪号:

keyword:ubelievable~

有关更多详细信息和您可能感兴趣的其他类型的查询,请参阅Lucene Parser Syntax 。

有两种处理同义词的方法。您尝试使用的查询扩展依赖于WordNet。正如SynExpand的文档所说,您应该首先调用Syns2Index以使用扩展。这是一种简单的方法,但它只适用于英语单词。

如果您需要添加对多种语言的支持或添加自己的同义词,您可以在索引期间使用同义词注入。这个想法是编写您自己的分析器,将您自己字典中的同义词注入索引文档。这听起来很难实现,但幸运的是,Lucene in Action书中有一个很好的示例(源代码是免费的,请参阅lia.analysis.synonym包。不过,我强烈建议您获取这本好书的副本)。

于 2011-08-13T22:41:30.607 回答