lucene的检索算法属于索引检索,即用空间换取时间,对需要检索的文件、字符流进行全文索引,在检索的时候对索引进行快速的检索,得到检索位置,这个位置记录检索词出现的文件路径或者某个关键字。在使用数据库的项目中,不使用数据库进行检索的原因主要是:数据库在非精确查询的时候使用查询语言 like "%keyword%",对数据库进行查询是对所有记录遍历,并对字段进行"%keyword%"匹配,在数据库的数据庞大以及某个字段存储的数据量庞大的时候,这种遍历是致命的,它需要对所有的记录进行匹配查询。因此,Lucene主要适用于文档集的全文检索,以及海量数据库的模糊检索,特别是对数据库的xml或者大数据的字符类型
全文检索 不等于 like "%keyword%"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
为了对文档进行索引,Lucene提供了五个基础的类,他们分别是 Document,Field,IndexWriter,Analyzer,Directory。
Document
是用来描述文档的,这里的文档可以指一个html页面,一封电子邮件,一个文本文件,一个Document对象由多个Field对象组成的。可以把一个Document对象想象成数据库中的一个记录,而每个field对象就是记录的一个字段。
Field
field对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由Analyzer来做的。Analyzer类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择合适的Analyzer。Analyzer把分词后的内容交给IndexWriter来建立索引
IndexWriter
IndexWriter是Lucene用来创建索引的一个核心的类,他的作用是把一个个的Document对象加到索引中来。
Directory
这个类代表了Lucene的索引的存储的位置,这是一个抽象类,它目前有两个实现,一个是FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。
-------------------------------------------------------------------------------------------------------------------------------------------------------
搜索文档
利用Lucene进行搜索就像建立索引一样也是非常方便的。Lucene提供了几个基础的类来完成这个过程,它们分别是IndexSearcher,Term,Query,TermQuery,Hits。
Query
这是一个抽象类,他有多个实现,比如TermQuery,BoomleanQuery,PrefixQuery,这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query
Term
Term是搜索的基本单位,一个Term对象有两个String类型的域组成。生成一个Term对象可以有如下一条语句来完成:Term term = new Term("fieldName","queryWord");其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键字。
TermQuery
TermQuery是抽象类Query的一个子类,它同时也是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成:TermQuery termQuery = new TermQuery(new Term("fieldName","queryWord"));它的构造函数只能接受一个参数,那就是一个Term对象
IndexSearcher
IndexSearcher是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作
Hits
Hits是用来保存搜索的结果的。