11.2.4 常用API介绍
Lucene的功能很强大,提供的API也比较多,读者只要掌握了下面这些常用的API,就能够使用Lucene实现对文本数据的索引和检索。
Directory类描述了Lucene索引的存放位置,它是一个抽象类,由其子类负责指定索引的存储位置。Directory的子类包括FSDirectory、RAMDirectory、FileSwitchDirectory等。
●FSDirectory表示将索引文件存储在文件系统中,包括SimpleFSDirectory、NIOFSDirectory和MMapDirectory,其中,SimpleFSDirectory主要用于Windows平台,NIOFSDirectory主要用于非Windows平台,MMapDirectory使用内存映射的I/O接口进行索引操作。除非读者对FSDirectory非常了解,否则不建议直接初始化它的某个子类,而是使用它的静态方法FSDirectory.open(),该方法会根据当前的操作系统和平台选择最合适的FSDirectory子类,具体选择算法会随着Lucene版本的更新而改进。
●RAMDirectory表示将索引文件全部存储在内存中,在数据量较小的情况下,索引文件的读写速度非常快。
●FileSwitchDirectory能够在给定的两个Directory之间进行文件操作,操作方式基于文件扩展名。例如,该类可以用于处理分别存储于FSDirectory和RAMDirectory中的索引文件。
Document是索引和搜索的基本单元,任何需要索引的数据都必须转化成Document对象,Document类似于数据库中的一条记录。
Field类用于描述文档的属性,Document是一组Field的集合,如果将Document理解为一条记录,那么Field可以理解为记录中的字段。例如,文章包含标题、作者、摘要、正文等属性,对文章进行索引时,每一篇文章对应一个Document,而文章的每个属性则对应于Document的一个Field。Field的子类有DoubleField、FloatField、IntField、StringField、TextField等,可以理解为不同的字段类型,用法示例如下:
- StringField stringField = new StringField("title", "文章标题", Field.Store.YES);
- TextField textField = new TextField("content", "文章内容...", Field.Store.YES);
Term是搜索的最小单位,它表示文档中的一个词语。
IndexWriter是创建索引的核心类,它的主要作用是创建或打开已有的索引文件,然后添加、更新或删除Document。IndexWriter的构造方法有两个参数,一个是Directory,一个是IndexWriterConfig,IndexWriterConfig是IndexWriter的配置类,用于配置索引所采用的分词器、索引合并策略、最大合并文档数等。
IndexReader是索引读取类,它的主要作用是通过Directory获取索引文件流,通常以只读方式打开索引文件。IndexReader类是为IndexSearcher类服务的。
IndexSearcher是搜索的核心类,用于在指定的索引文件中进行搜索。IndexSearcher类比较常用的方法如下:
- // 从索引中取出id为docID的文档
- Document doc(int docID) throws IOException
- // 查看文档得分的解释
- Explanation explain(Query query, int doc) throws IOException
- // 从索引中搜索满足查询请求query的所有文档,最多返回n条
- TopDocs search(Query query, int n) throws IOException
search()方法的返回结果是TopDocs对象,它表示搜索结果中得分排前n的文档集合。
Query表示查询请求,Lucene提供了很多种Query,用于支持各种查询需求,主要包括BooleanQuery(布尔查询)、FuzzyQuery(模糊查询)、PhraseQuery(短语查询)、PrefixQuery(前缀查询)、RangeQuery(范围查询)、TermQuery(词条查询)、WildcardQuery(通配符查询)等。
QueryParser是查询解析器,它能够从查询表达式中分析出查询请求,并转化为内部的Query或Query组,这使Lucene查询功能变得更加灵活和强大。用法示例如下:
- QueryParser parser = new QueryParser(Version.LUCENE_46, fieldName, analyzer);
- // 解析查询请求
- Query query = parser.parse(sentence);