Lucene学习笔记
Lucene的特点:
1:灵活的接口函数
2:分块索引和批量索引
3:数据源灵活多样
4:索引字段可以定制
5:索引文件与平台无关
6:面向对象的系统架构
Lucene系统架构:
采用面向对象的系统架构,如下是其核心包及其功能说明
核心包名
|
功能说明
|
org.apache.lucene.analysis
|
语言分析器;主要用于分词
|
org.apache.lucene.document
|
索引存储的文档管理,类似关系数据系统中的表
|
org.apache.lucene.index
|
索引管理:增加、修改、删除索引等
|
org.apache.lucene.queryParser
|
查询分析器:实现查询关键词的运算
|
org.apache.lucene.search
|
检索管理:根据查询条件,检索到结果
|
org.apache.lucene.store
|
数据存储管理:主要包括底层的一些I/O操作
|
org.apache.lucene.util
|
包括一些公共的使用类
|
Lucene的核心索引类:
1:IndexWriter :建立索引的核心组件。使用 IndexWriter 可以新建一个索引并将对象文件逐一添加到索引当中,但不可以执行读取和搜索操作。
2:Directory:代表一个 lucene 索引项的位置。这是一个抽象类,其具体实现有FSDirectory和RAMDirectory。前者将索引写入硬盘,对应于真实的文件系统路径,后者则将索引写入内存,相比于前者效率高但可用空间小。
3:Analyzer :对文本内容进行分析的抽象类,具体实现中有停用词切除、词干分析、大小写切换等功能。
4:Document :可以视作文本经过处理后所对应的对象,由多个字段组成,如路径、标题、摘要、修改日期等等。
5:Field :字段,对应于文本的某一部分数据,便于检索时根据结果提取。
Lucene的核心检索类:
1:IndexSearcher :检索操作的核心组件,用于对 IndexWriter 创建的索引执行,只读的检索操作,工作模式为接收 Query 对象而返回 Hits 对象。
2:Term :检索的基本单元,标示检索的字段名称和检索对象的值,如Term( “title”, “lucene” )。即表示在 title 字段中搜寻关键词 lucene 。
3:Query:表示查询的抽象类,由相应的 Term 来标识。
4:TermQuery :最基本的查询类型,用于匹配含有指定值字段的文档。
5:Hits :用来装载搜索结果文档队列指针的容器。
Lucene与数据库的类比:
|
数据库
|
Lucene
|
概
念
|
列/字段
|
Field
|
行/记录
|
Document
|
|
查询(SELECT)
|
Searcher
|
|
操
作
|
添加(INSERT)
|
IndexWriter. addDocument
|
删除(DELETE)
|
IndexReader.delete
|
|
修改(UPDATE)
|
不支持(可删除后重新添加)
|
package com.fxr.demo2; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class TestIndex { public static void main(String[] args) throws IOException { String [] ids = {"1","2","3"}; String [] names = {"zhangsan","lisi","wangwu"}; String [] addresses = {"zhengzhou","shanghai","beijing"}; Analyzer analyzer = new StandardAnalyzer();//标准的分词器 String indexDir = "f:/lucenefxrindex"; Directory dir=FSDirectory.getDirectory(indexDir);//索引存放的位置 //TRUE 表示创建或者覆盖当前的索引;FALSE表示对当前的索引进行追加 //default 的值是128 IndexWriter indexWriter = new IndexWriter(dir,analyzer,true,IndexWriter.MaxFieldLength.LIMITED); for(int i=0;i<ids.length;i++){ Document document = new Document(); document.add(new Field("id",ids[i],Field.Store.YES,Field.Index.ANALYZED)); document.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED)); document.add(new Field("address",addresses[i],Field.Store.YES,Field.Index.ANALYZED)); indexWriter.addDocument(document); } indexWriter.optimize(); indexWriter.close(); } }
package com.fxr.demo2; import java.io.IOException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class TestDelete { public static void main(String[] args) throws IOException { String indexDir = "f:/lucenefxrindex"; Directory dir=FSDirectory.getDirectory(indexDir); IndexReader reader=IndexReader.open(dir); System.out.println(reader.maxDoc()); //reader.deleteDocument(0); System.out.println(reader.maxDoc()); System.out.println(reader.deleteDocuments(new Term("id","2"))); System.out.println(reader.numDocs()); reader.close(); dir.close(); } }