使用Lucene的两段精要代码

Lucene简介:
Lucene是一个基于Java的全文索引工具包。Lucene的发展历程:早先发布在作者自己的www.lucene.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/.
Jive,Eyebrows,Cocoon,Eclipse中都使用了Lucene
全文检索和数据库应用最大的不同在于:让最相关的头100条结果满足98%以上用户的需求


索引过程中可以看到:
    * 语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的,虽然lucene缺省提供了2个比较通用的分析器 SimpleAnalyser和StandardAnalyser,这2个分析器缺省都不支持中文,所以要加入对中文语言的切分规则,需要修改这2个分析器。或者建立自己的语言分析器
    * Lucene并没有规定数据源的格式,而只提供了一个通用的结构(Document对象)来接受索引的输入,因此输入的数据源可以是:数据库,WORD文档,PDF文档,HTML文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象即可进行索引。
    * 对于大批量的数据索引,还可以通过调整IndexerWrite的文件合并频率属性(mergeFactor)来提高批量索引的效率。
查询分析器支持逻辑包括and or + - &&||等符号

Hacking Lucene
1.简化的查询分析器 2.添加修改删除指定记录(Document)3.根据某个字段值的排序功能 4.更通用的输入输出接口 5.索引过程优化 6.搜索过程优化

第一个类IndexFields.java(省略了import部分),建立索引
 1/**
 2 * 为指定文件的内容建立索引文件,存储索引到指定的目录中
 3 */
 4public class IndexFields {
 5
 6//  使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...
 7//  执行成功后会在 indexPath 下产生索引文件,如_4.cfs,deletable,segments
 8    public static void main(String[] args) throw* **ception {
 9      String indexPath = args[0];
10      IndexWriter writer;
11
12      //用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)
13      //初次建立索引是第三个参数必须为true,因为不存在索引文件还不能追加
14      writer = new IndexWriter(indexPath, new SimpleAnalyze*(), **lse);
15
16      for (int i=1; i<args.length; i++) {
17        System.out.println("Indexing file " + args[i]);
18        InputStream is = new FileInputStream(args[i]);
19
20        //构造包含2个字段Field的Document对象
21        //一个是路径path字段,不索引,只存储
22        //一个是内容body字段,进行全文索引,并存储
23        Document doc = new Document();
24        doc.add(Field.UnIndexed("path", args[i]));
25        doc.add(Field.Text("body", (Reader) new InputStreamReader(is)));
26
27        //将文档写入索引
28        writer.addDocument(doc);
29        is.close();
30      };
31
32      //关闭写索引器
33      writer.close();
34    }
35}

第二个类Search.java(省略了import部分),按关键字在索引中搜索
 1/**
 2 * 在索引中搜索关键词,并输出结果,包含所在路径及出现频度
 3 */
 4public class Search {
 5
 6    //  使用方法:: IndexFiles [索引所在目录] [关键词]
 7    public static void main(String[] args) throw* **ception {
 8        String indexPath = args[0], queryString = args[1];
 9
10        //指向索引目录的搜索器
11        Searcher searcher = new IndexSearcher(indexPath);
12
13        //查询解析器:使用和索引同样的语言分析器
14        Query query = QueryParser.parse(queryString, "body", new SimpleAnalyzer());
15        //搜索结果使用Hit*存储
16        **** ***s = searcher.search(query);
17
18        //通过hits可以访问到相应字段的数据和查询的匹配度
19        for (int i = 0; i < hits.length(); i++) {
20            System.out.println(hits.doc(i).get("path") + "; Score: " + hits.score(i));
21        }
22    }
23}

主要参考自:

基于Java的全文索引引擎Lucene简介
中文语言的切分词
关于基于词表和N-Gram的切分词比较
Utting在Pisa大学做的关于Lucene的讲座:非常详细的Lucene架构解说 永久链接 https://yanbin.blog/lucene-two-code/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。