Lucene用来建搜索引擎要解决四个问题:抓取数据、解析数据、创建索引和执行搜索。
抓取数据和解析数据的知识独立于Lucene,而创建索引就如同建立文集,文集里面有许多文章,每一篇文章包括标题、内容、作者名称、写作时间等信息。我们采用这种方式写文集:
首先为每一篇文章添加标题、内容、写作时间等信息,从而写好每一篇文章,然后将每一篇文章添加到书里面去。这样问及就写好了。
创建索引的过程如下:
① 建立索引器IndexWriter,这相当于一本书的框架。
② 建立文档对象Docment,这相当于一篇文章。
③ 建立信息字段对象Field,这相当于一篇文章中的不同信息(标题、正文等)。
④ 将Field添加到Document里面。
⑤ 将Document添加到IndexWriter里面。
⑥ 关闭索引器IndexWriter。
创建索引有三个基本步骤:
① 创建Field,将文章的不同信息包装起来。
② 将多个Field组织到一个Document里面,这样就完成了对一篇文章的包装。
③ 将多个Document组织到一个IndexWriter里面,也就是将多篇文章组装起来,最终形成索引。
一、创建Field:
创建Field的方法很多,下面是最常用的方法:
Field field=new Field(Field名称,Field内容,存储方式,索引方式);
这四个参数的意义如下:
① Field名称就是为Field起的名字,类似数据表的字段名称。
② Field内容就是该Field的内容,类似数据表的字段内容。
③ 存储方式包括三种:
不存储(Field.Store.No)、完全存储(Field.Store.YES)和压缩存储(Field.Store.COMPRESS)
一般情况下不担心索引太大的话,可以都使用完全存储的方式,但出于对性能的考虑,索引文件的内容是越小越好,因此,如果Field的内容很少就采用完全存储(如标题),如果Field的内容很多就采用不存储或者压缩存储的方式(如正文)。
④ 索引方式包括四种:
不索引(Field.Index.No),索引但不分析(Field.Index.NO_NORMS)、索引但不分词(Field.Index.UN_TOKENIZED)、分词并索引(Field.Index.TOKENIZED)
通常我们会按照标题和全文进行模糊搜索,这类需要进行模糊搜索的字段就用Field.Index.TOKENIZED。通常我们会按照作者名称进行模糊搜索,需要进行精确搜索的字段就用Field.Index.UN_TOKENIZER。对于那些只需要跟着搜索结果显示出来却不需要按照其内容进行搜索的字段,使用Field.Index.NO。
二、创建Document
Document doc=new Document();//这个方法创建一个不包含任何Field的空Document。
如果想把Field添加到Document里面,只需要使用add方法,如:doc.add(field);
重复使用这个方法就可以将多个Field加入到一个Document里面。
三、创建IndexWriter
创建IndexWriter方法很多,下面是最常用的方法:
IndexWriter writer=new IndexWriter(存储索引的路径,分析器的实例);
这两个参数的含义如下:
① 储索引的路径就是索引被存储在硬盘上的物理路径,如:c:\myDir等。
② 分析器实例。分析器用来做词法分析的,包括英文分析器和中文分析器等。要根据索要建立缩影的文件情况选择恰当的分析器,常用的有StandardAnalyzer(标准分析器)、CJKAnalyzer(二分法分词器)、ChineseAnalyzer(中文分析器)和FrenchAnalyzer(法语分析器)等,也可以根据自己的需要去编写分析器,从而处理不同的语言文字。
通过建立IndexWriter,就把逻辑索引和物理索引联系起来了,这样就可以很方便地建立索引,如IndexWriter writer=new IndexWriter(”c:/my/index”,newCJKAnalyzer());
使用new IndexWriter()方法建立起来的是一个空的索引器,要把Document添加到索引中来,需要使用addDocument方法,如:
Writer.addDocument(doc);
类似于向Document中添加Field,重复执行这个操作就可以向一个IndexWriter中添加多个Field.
最后在索引创建完成的时候要使用close方法关闭索引器:
Writer.close();