标签:
当今时代是一个网络时代,是一个信息数字化时代,是一个信息大爆炸的时代,在这个时代中,快速的从信息海洋中获取自己想要的信息,已经是每一个人最迫切的需要,当然,我们现在已经有相应的产品(百度,谷歌等)为人们提供了这样的服务,但是,仍然没有办法满足人们的需求,因为百度和谷歌等搜索引擎公司提供的是大众化的公网搜索服务,只能满足于大众群体,而对于公司级的群体是满足不了的,因为公司级的群体,使用的是自己内部的系统,而要想要这样的系统具有像百度/谷歌那样类似的功能时,我们程序员应该通过编写代码来实现。
lucene是一个框架,编程人员可以使用其jar,快速的开发一个全文索引的功能,而不需要从0开始慢慢的编写。
使用lucene编写的搜索功能,只能对文本进行搜索(不能对语音、图片和视频进行搜索),并且是关键词的索引(不是语义搜索)
我们使用的数据库也可以进行相应的搜索功能,像like条件查询,这个能的操作确实可以实现,为什么还要lucene的这样的全文搜索框架呢?
要想弄懂这个,需要知道两点。第一:被搜索的数据的数量一定非常的多,如果不大的话,根本不需要这个功能;第二:数据库的like等条件搜索,即使创建相应的索引,也是非常消耗资源的,具体大家可以看这篇博客:如何编写高效的SQL查询语句
lucene的全文索引的优点就是解决了数据库索引消耗资源大的问题,所以,数据库索引不能替代全文索引。
lucene通过维护自己的索引库,实现全文索引的功能。lucene对索引库的操作主要有两个,数据写入和数据检索。
数据写入过程描述。
数据写入索引时,需要先指定索引库的位置,lucene给我们提供了文件和内存两个位置,以文件位置为例,指定索引库的具体位置在那个文件夹后;然后,需要创建一个分词器,这里使用标准的分词器;有了索引库对象和分词器对象后,我们就可以创建索引库更新操作对象(indexWriter)了,该对象将文本内容保存到索引仓库中;创建document对象,该对象就相当于indexWriter对象操作的对象,这里我们就需要注意,我们需要将文本内容转换为document对象类型,此时需要Field对象,field是document的成员,document相当于表,field相当于字段;最后,通过indexWriter直接操作document就可以了
数据读取操作。
创建索引库对象,指定索引库的位置,以便从里面读取数据;创建indexSearcher对象,查询索引库的内容;创建分词器,用于分解搜索的句子;创建QueryParser对象,相当于确定字段;创建Query,相当于确定字段的值;最后使用indexSearcher对象进行查询;TopDoc代表从索引库查询出的结果的一个外观对象;ScoreDoc代表索引库的一条记录。
lucene仅仅用于文本文件的索引,但是,其存放的却是二进制文件(针对值编码),所以,其内容更新比较麻烦,默认情况下,采用的更新方式是差异版本的迭代,就是更新一个文件的一个内容的时候,之前那个文件保存不变,专门为这个内容再创建一个文件,并更新成新的数据,然后,之后查询的时候,再查询所有文件。
知道这个过程后,我们就需要解决一个问题,那就是文件过多,导致IO操作过多的现象,lucene也为我们提供了合并文件的操作。
lucene的文件索引库,使用的是硬盘上的文件,IO操作太频繁,会造成性能下降。使用内存索引库时,一定服务器重新,所有的内容都将丢失。基于此,我们可以使用内存索引库+文件索引库的方式进行索引库的管理。
在程序上,我们也可以使用相应的优化,就是尽量少的产生没有意义的关键词,因为分词器产生的每个关键词都会存储在索引库的目录库中,如果产生的索引太多,就会影响性能,当然,必须要的关键字我们是一个也不能省的。
全文索引的实现方式有多种,lucene只是其中的一种具体实现的框架,并且,其功能非常的强大。
标签:
原文地址:http://blog.csdn.net/jiben2qingshan/article/details/44775043