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();
}
}
浙公网安备 33010602011771号