Lucene02----整体架构

2 篇文章 0 订阅

 

Lucene的总体架构

 

 

Lucene 是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点

 

 

 

Lucene 的各组件

 

 

  被索引的文档用Document对象表示。

   IndexWriter通过函数addDocument将文档添加到索引中,实现创建索引的过程。

   Lucene的索引是应用反向索引。

   当用户有请求时,Query代表用户的查询语句。

   IndexSearcher通过函数search搜索Lucene Index。

 

  IndexSearcher计算term weight和score并且将结果返回给用户。

 

 

Lucene API 的调用实现索引

File path = new File("G:/index");
if (!path.exists()) {
		path.mkdir();
}
//索引文件保存的目录
Directory d = FSDirectory.open(path);
//词法分析及语言处理组件
Analyzer analyzer = new StandardAnalyzer(DEFAULT_VERSION);
//保存有关IndexWriter的所有配置信息
IndexWriterConfig conf = new IndexWriterConfig(DEFAULT_VERSION,
					analyzer);
//创建以及维护一个索引的IndexWriter
IndexWriter indexWriter = new IndexWriter(d, conf);


//要简历索引的目录
File indexFileDir = new File("G:/SearchDir");
File[] files = indexFile.listFiles();
for (File file : files) {
			if (file.isDirectory()) {
					fileIndexerProcessor(writer, file);
				} else {
					Document document = new Document();
		document.add(new Field("text", new FileReader(file)));
					writer.addDocument(document);
				}
		}
//在一个索引上执行优化操作
indexWriter.optimize();
//提交在一个索引上所做的所有改变以及关闭关联的文件。要注意这是一个昂贵的操作,要尝试重用单个IndexWriter实例而不是关闭和重新创建
indexWriter.close();
 

 

搜索过程

File indexDir = new File("G:/index");	
//索引文件存放的目录
	Directory dir = FSDirectory.open(indexDir);
 	//IndexReader是一个抽象类,提供了访问一篇索引的接口
	IndexReader reader = IndexReader.open(dir); 
	//在单个IndexReader搜索的实现,通常,应用程序只需要调用继承的 search(Query,int) or search(Query,Filter,int) 方法,为了更好的性能,当你的索引没有修改的情况下,一般最好在多个搜索上共享一个IndexReader实例,而不是每一次搜索都新创建一个。如果你的索引被修改了并且你希望看到这些修改对搜索结果的影响,应该使用IndexReader.reopen() 来获取一个新的reader然后用它创建一个新的IndexSearcher。
	IndexSearcher searcher = new IndexSearcher(reader);
    //Analyzer创建了解析文本的TokenStreams,它代表了一种从文本中提取索引项的方针
	Analyzer analyzer = new StandardAnalyzer(DEFAULT_VERSION);
	//QueryParse对查询语句行进分析,有JAVACC生成,最重要的方法就是parse(String);
	QueryParser parser = new QueryParser(DEFAULT_VERSION, "text",
					analyzer);
    //QueryParser 调用parser 进行语法分析,形成查询语法树,放到Query 中
	Query query = parser.parse("Romanian,Bulgarian");
	//TopDocs代表搜索所获得的命中的结果数
	TopDocs hits = searcher.search(query, null, 10);
		System.out.println(hits.totalHits);
 

 

此图是上一节介绍的全文检索的流程对应的Lucene 实现的包结构

Lucene 的analysis 模块主要负责词法分析及语言处理而形成Term。

Lucene的index模块主要负责索引的创建,里面有IndexWriter。

Lucene的store模块主要负责索引的读写。

Lucene 的QueryParser主要负责语法分析。

Lucene的search模块主要负责对索引的搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值