Lucene
今天由汤阳光老师(不如说是汤兄)给我们讲lucene,一见汤兄,太年轻了,真是这感觉真让我有些小惭愧,呵呵。。。还是学好技术是第一要务。
从
现在到年前都是汤兄给我们上课,今天和明天是搜索引擎,存储数据用的是Hibernate,全文检索的简化框架是Compass,Lucene讲1.5
天,Compass讲半天。总结一天所学的.全文检索是目前最流行的技术,由于用数据库搜索实现的匹配度,相关度排序和搜索速度太慢,而这些都非常致命。
下面详细回顾:
1.信息检索:找出与用户需求相关的信息
平时接触的信息有文:html,doc,pdf和 txt,
多媒体:音频,视频,图片...
全文检索: 1.只关注文本。比如我搜索:中国的首都在哪里?和我搜索中国 首都
北京是一样的,我们主要是研究出现了某些词的文本 2.不处理语义,只是词匹配
全文检索的作用:1.bbs,blog,news,商城的站内搜索,资源有限
Eclipse的帮助就是用Lucene做的
2.入门
运行原理/入门概念
Hello World
需求:就像百度的搜索框一样,输入内容,点击搜索,得出结果,并且要求时间非常短
后台:点搜索后,会去信息集合(索引库)里搜索,注:这个索引库是按照一定的结构存储,这个结构可以实现快速搜索
使用流程:1事先就不停再找,建立索引,2.搜索
索引库的结构:索引库是存到一些二进制文件,这些文件在同一个目录下 --à索引库目录
Document 一条数据
Field 数据中的一个字段
Field是组成Document的元素
实现:
步骤:1.建立索引
2.搜索
都用到的是分词器(analyzer),应使用同一种分词器
实现HelloWorld:添加jar包
lucene-core-2.4.0.jar(核心);
contrib/analyzers/lucene-analyzers-2.4.0.jar(分词器);
contrib/highlighter/lucene-highlighter-2.4.0.jar(高亮器);
1.建立Article.java,属性有id,title,content
2.HelloWorld.java.两个主要方法:
1.建立索引:
createIndex()
2.搜索
search()
进行搜索
public void search() throws Exception {
String
queryString = "document";
//
1,把要搜索的文本解析为 Query
String[]
fields = { "name", "content" };
QueryParser queryParser = new
MultiFieldQueryParser(fields, analyzer);
Query query
= queryParser.parse(queryString);
//
2,进行查询
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
Filter
filter = null;
TopDocs
topDocs = indexSearcher.search(query, filter, 10000);
System.out.println("总共有【"+topDocs.totalHits+"】条匹配结果");
// 3,打印结果
for(ScoreDoc
scoreDoc : topDocs.scoreDocs){
int docSn = scoreDoc.doc; // 文档内部编号
Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
File2DocumentUtils.printDocumentInfo(doc; // 打印出文档信息
}
}
IndexWriter:操作索引库,增删改
主要方法介绍:
// 构造方法:如果索引库不存在,会自动创建。如果存在,就使用他
new IndexWriter(String/Directory indexPath, Analyzer a,
MaxFieldLength mfl)
// 构造方法:第三个参数指定是否创建一个新的索引库。
// 1,有索引库,create为true:会重新创建。2,没有索引库,create为false,会报错。
new IndexWriter(String/Directory indexPath, Analyzer a, boolean
create, MaxFieldLe
ngth mfl)
// 添加索引
addDocument( Document doc )
// 更新
updateDocument(Term term, Document doc)
// 删除
deleteDocument(Term term)
// 合并索引库
addIndexesNoOptimize(Directory[])
今天学了Lucene的入门,明天学习Lucene的高级知识,以及compass框架!
// 优化索引库
optimize()
IndexSearcher:操作索引库,查询
// 构造方法,索引库不存在,就报错
new IndexSearcher( String indexPath )
// 搜索
TopDocs search( Query query, Filter filer, int n )
// 搜索
TopDocs search( Query query, Filter filer, int n , Sort sort)
Document doc( int docSn )
Documet:Lucene所操作的对象
Field:组成Document的元素,代表一个属性。Store、Index
new Field( String name, String value, Store
store, Index index )
Directory:索引库(目录)
FSDirectory
:真实的目录