Lucene
全文检索就是从非结构化数据中提取部分信息形成索引,再对索引进行查询。对于数据量大,结构不稳定的数据,要使用全文检索比如字典
Lucene是一个开源的全文检索引擎工具包,提供了查询引擎和索引引擎
Lucene实现全文检索(创建索引和搜索两个过程)的流程:
索引过程:对原始内容进行索引构建成一个索引库,过程就是确定要搜索的原始内容(指要索引和搜索的内容),然后采集文档,构建文档,分析文档,形成索引文档。
搜索过程:从索引库中搜索内容,过程就是用户通过查询界面,输入要查询的信息,然后创建查询,执行搜索,从索引库中查询后渲染搜索结果返回给用户。
构建文档:
把每一个文件当做一个document(文档),文档中有域的概念相当于数据库中的字段,每个文档可以有多个域,不同的文档可以有不同的域,同一个文档可以有相同的域,每个文档都有一个唯一的编号,就是文档id
分析文档:
主要就是对域中的内容进行分析,比如提取单词,大写转小写,去标点等生成最终的语汇单元(可以理解为一个一个的单词),每个单词叫做一个term(就是key,value类型的,包含两部分,一部分是文档的域名,一部分是单词的内容),不同域中分析出来的相同的单词是不同的term。
比如现在有一个文档spring.txt,文档内容为这一句话:Lucene is a Spring Framework provides.
对这个文档进行分析,首先经过提取单词,大写转小写,去标点,以及去除一些没有具体语义的词,得到‘lucene’,'spring','framework','provides'这些单词组成了多个term,term:file_content lucene,term:file_content spring,term:file_content framework,term:file_content provides,term:file_name spring,这个文件组成了5个term,这5个term将作为索引保存到索引库中,
创建索引:
创建出来的索引放到索引库中,首先要知道,在索引库中有两部分组成,一部分是term,两一部分是文档,就是一个字典,有目录也有目录对应的内容。过程是这样的,把从文档中分析出来的term和文档对应放入索引库,在term中,含有对应文档的编号,如果多个文档中有相同的term,这时候这个term中就有多个文档的编号,逐步把所有的term放入索引库中。我们是根据索引找文档,这种索引的结构是倒排索引结构。传统的索引是根据文件查找文件内容,然后在文件中匹配相应的关键词,这种是顺序扫描方法,数据量大的时候,会很慢。
倒排索引结构也叫反向索引结构,包括索引和文档两部分。
搜索索引:
步骤就是,首先创建Directory对象,就是索引库存放的位置,然后创建一个indexReader对象,然后获得indexSearcher对象,继续创建一个termQuery对象,指定查询的域和关键词,执行查询,返回的是一个数组,遍历出的是含有该关键词的文档编号,根据文档id去查询文档并返回文档,结束。