一:java中的引擎简介
java中的9大引擎框架可以从底层实现分为2个大类:基于lucene实现以及扩展的各式搜索以及Nutch实现可爬虫式的引擎。
我们将主要以lucene作为技术主干。
0.使用场景
当我们在一个实体类中实现多个属性同时查询,一次遍历每一个属性实现like查询,这样不仅繁琐而且特别浪费资源。
1.什么是lucene
lucene是一套全文检索引擎的架构,而不是一个完整的全文检索引擎。简而言之,你可以把它当成一个工具包,可以整合自己的
技术来实现一套完整的全文检索和搜寻额度项目方案。
2.lucene的优势与特点
(1)平台独立性,其基于8字节的索引文件格式,可以使其脱离平台的束缚。
(2)分块检索,区别于传统的倒叙索引,以分块索引实现多线程式的检索。、
(3)面向对象的特性。
(4)应用程式接口,lucene起本省是一个以应用程式接口对外开放,以流方式实现传输。(类似于java的接口,好处。。)
(5)强大的搜索引擎,其本省完成了一套查询,分区查询,模糊查询的查询方式,用户直接调用即可。
二:lucene检索
1.基于luncene的检索分为2个过程: 建立索引和搜索
过程简析为:当有新的查询进入lucenen进行对文件词条分析,生成索引,查询开始检索索引并进行词条解析,产生结果。
整个执行顺序为:
搜索1 -》索引1 -》索引2 -》索引3 -》搜索2 -》搜索3 -》搜索4 -》搜索5 -》搜索6。其中2,3俩个根据情况可调换。
2.lucene的输入和输出
在上面我们说过lucene对外开放的是类似于java中的接口,因此,就有了接口参数和接口返回,至于接口内的实现我们后面说。
(1)lucene的接口参数和接口返回
lucene的API接口设计是一个基于文件式的应用程接口。其输入输出的结构类似于List =》 record =》 str(即表 =》 单条数据
=》单个字段)。因此很多数据库都可以直接映射到存储结构/接口中。很多时候,我们可以将Lunce当成一个支持全文检索的数
数据库系统。
(2)接口的实现原理
在一般的结构性数据库中(如mysql),我们进行模糊查询 like %???%这样的方式来查询,这样如果数据库中有100万条数据,
该查询就要进行烧苗至多100万条数据。但是如果我们知道该数据在前10万条中,那么至多烧苗10条。即在传统的方式添加了
一个index < 100000这个条件。那么如何添加index <100000这个条件,比如我们基于创建日期等等做相关条件,这里涉及到一个
核心的问题:排序的问题。我们认为上述条件就是添加了另外一条排序条件。
上述中我们可以了解添加的排序条件越多,其搜索范围越小,其效率越高。这些排序条件可以看成建立索引的方式。索引建立
的越合适其搜索效率越高(并不是索引越多越好的)。
(3)lucene的接口实现方式
大部分的搜索(数据库)引擎都是用B树结构来维护索引的,基于B树结构索引一旦更新索引会导致大量的IO操作。而在
lucene的实现中,其维护方式类似于链式的新增,或者定时合并一些相邻的链,减小链长度。
三:lucene中重要的概念
1.analyzer
分析器,即作用于图中搜索1和索引1指向的位置,用来将字符串按照一定的规则划分,并去掉无效词句,简而言之,语义解析
2.document
数据源,可以使文本,字符串或者数据库中的记录。在经过lucene的索引处理,该数据源都会以Document的形式存储和展示。
3.field
数据源中的信息域,可以是标题,正文,时间等等。这些信息都是通过field在document中存储的。其中field中有2个属性存储和
索引。其控制着field中的信息是否可以存储,是否可以检索。
4 term
term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。
5.tocken
tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它
们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。
6.segment
就像上面所说,一个索引的新增都是新增在头尾的方式,然后定期的进行比较和并,这里没有合并前的索引文件就是segnebt。