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 索引项的位置。这是一个抽象类,其具体实现FSDirectoryRAMDirectory。前者将索引写入硬盘,对应于真实的文件系统路径,后者则将索引写入内存,相比于前者效率高但可用空间小。
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();




	}
}

  

 
 
 
 
 
 
 

posted on 2015-02-25 17:36  aicpcode  阅读(139)  评论(0编辑  收藏  举报

导航