Lucene搜索引擎开发
第一次阅读:2012-12-28
可以使用Lucene 开发搜索引擎系统,目前最为著名的是 Nutch 。
建立索引代码分析:
Directory directory = FSDirectory. open ( new File( "F:\\Lucene\\example\\index01" ));
/***----------------建立索引存放的位置目录 -----------------------------------------------------------------***/
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(Version. LUCENE_36 , new StandardAnalyzer(Version. LUCENE_36 )));
/***----------------设置 Lucene 版本和分词器 ----------------------------------------------------------------***/
Document doc = new Document();
/***----------------建立 Document 对象 ---------------------------------------------------------------------***/
doc.add( new Field( " field " , " content " ,Field.Store. YES ,Field.Index. ANALYZED ));
/***----------------将文本加入 Document 对象 (field 表示域名, content 表示文本内容 )----------------------***/
writer.addDocument(doc);
/***----------------将 Document 对象写入索引 ---------------------------------------------------------------***/
搜索代码分析:
/***----------------第一步:获取 Searcher-----------------------------------------------------------------***/
IndexReader reader = null ;
Directory directory = FSDirectory. open ( new File( "F:\\Lucene\\example\\index01" ));
if (reader== null )
reader = IndexReader. open (directory);
else
{
IndexReader tr = IndexReader. openIfChanged (reader);
if (tr!= null )
{
reader.close();
reader=tr;
}
}
IndexSearcher searcher = new IndexSearcher(reader);
/***----------------第二步:创建 Query (不同的搜索会创建不同的 Query 或者是其他组合) -------------***/
Query query = new FuzzyQuery( new Term( "name" , "make" ));
/***----------------第三步:创建 TopDocs ,获取结果 ---------------------------------------------------------***/
TopDocs tds = searcher.search(query, 10);
for (ScoreDoc sd : tds. scoreDocs )
{
Document doc = searcher.doc(sd. doc );
System. out .println(doc.get( "attach" ));
}
索引的建立具体讲解:
1,建立索引的基本过程
A:建立索引器 IndexWriter ,这相当于一本书的框架。
B:建立文档对象 Document ,这相当于一片文章。
C:建立信息字段对象 Field ,这相当于一片文章中的不同信息(标题,正文等)。
D:将 Field 添加到 Document 里面。
E:就 Document 添加到 IndexWriter 里面。
F:关闭索引器 IndexWriter 。
基本步骤:
A:创建 Field ,将文章的不同信息包装起来。
B:将多个 Field 组织到一个 Document 里面,这样就完成了对一篇文章的包装。
C:将多个 Document 组织到一个 IndexWriter 里面,也就是将多个文章组织起来,最终形成索引。
2, Field
Field field = new Field(Field名称,Field内容,存储方式,索引方式);
Field名称:
通常指字段名
Field内容:
通常指字段内容
存储方式:
Field.Store.NO不存储
Field.Store.YES完全存储
Field.Store.COMPRESS压缩存储 (注:对于文章正文一般采用不存储或者压缩存储)
索引方式:
Field.Index.NO不索引
Field.Index.NO_NORMS索引但不分析
Field.Index.UN_TOKENIZED索引但不分词
Field.Index.TOKENIZED 分词并且索引
3,Document
Document doc = new Document();
创建一个不含任何Field的空Document
doc.add(field);
将field加入Document
4,IndexWriter
IndexWriter writer = new IndexWriter(directory,indexWriterConfig);
Directory directory = FSDirectory.open(new File(path));
new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36))
writer.addDocument(doc);
将Document对象加入IndexWriter中
writer.close();
关闭IndexWriter
5,注意:
对于对某个文件或者某个目录下的所有的文件进行建立索引时,一般是将文件名和文件内容进行索引、文件全路径进行索引(可选)。
搜索的具体讲解:
执行搜索的基本方式:
1,创建搜索器对象IndexSearcher
IndexSearcher searcher = new IndexSearcher(indexReader);
Searcher.search(......);
搜索,有很多重载的方法,参数不一
searcher.close();
关闭IndexSearcher对象
2,封装搜索条件:Term对象和Query对象
Term term = new Term(字段名称,关键字);
Query query = new TermQuery(term);
3,搜索
TopDocs tds = searcher.search(query,........)
中文分词器讲解:
StandardAnalyzer标准分析器(默认是对每一个字进行索引),如果索引中有“红”,而搜索“工”是搜索不到的!
分 词 的方法:
(1) 单字切分
(2) 二分法
(3) 词典法
(4) 语义法
Lucene的分词器:
(1) 二分分词器
(2) Lucene自带的中文分词器
(3) NGram分词器
(4) JE分词器
(5) IK分词器
接下类的内容:
· 桌面搜索引擎开发
· web搜索引擎开发
· 数据解析(常见二进制文件,xml,html,集成数据......)
· Lucene自带的数据解析方法
· Lius
· 索引高级部分(索引的管理和优化)
· Nutch