一、什么是全文索引
全文检索首先将要查询的目标文档中的词提取出来,组册索引(类似书的目录),通过查询索引达到搜索目标文档的目的,这种先建立索引,再对索引进行搜索的过程就叫全文索引。
从图可以看出做全文搜索的步骤:
1、对目标数据源中提取相应的词建立索引
2、通过检索索引(检索索引中的词),从而找到目标文件即源数据。
现在的全文检索不仅能对字符串进行匹配,而是已经发展到可以对大文本、语言、图像、活动影像等非结构化数据进行综合管理的发、大型软件。
二、lucene
百度百科
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
1、使用lucene建立索引(对目标数据源中提取相应的词建立索引)
ps:什么是文档(Document) 文档就是我们要采集的目标数据源,他可以是文件、图片、数据库表中的一条记录。
- Acquire Document:采集文档
- Build Document:建立文档
- Analyzer Document:采用分词器分析文档
- Index Document:对分词后的文档建立索引
- Index:将建立好的索引存入索引库
2、使用lucene检索索引(通过检索索引(检索索引中的词),从而找到目标文件即源数据)
ps:这里的Index 索引库 就是第一步中使用lucene建立的索引库。
- Search User Interface:查询接口
- Build Query:创建查询对象
- Run Query:执行查询(从索引库中查询)
- Render Results:获取查询结果,并将结果返回给用户
三、Field(域)的概念
1、获取原始内容的目的是为了建立索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域(field)在lucene中就是用于搜索和存储分词后的内容,我们在搜索时就是通过域进行的。
例如磁盘中的一个文件我们将它当作一个Document,那么该Document包括这些Field域
a、file_name:文件名
b、file_path:文件路径
c、file_size:文件大小
d、file_content:文件内容
四、分词
分词:将原始内容创建为包含域Field的文档(document),需要再对域中的内容进行分析,分析的过程是经过对原始文档提取单词,将字母转为小写,去掉标点符号,去掉停用词等过程生成最终的语汇单元。可以将语汇单元理解为一个一个单词。
例如
原始文档:Collector construction for two-pass grouping queries is
分析后的语汇单元是:Collector、 construction、 for、 two、pass 、grouping 、queries 、is
检索原理:lucene会将你传入的搜索条件按照与创建索引相同的分词方式进行分词形成语汇单元,然后根据这些语汇单元搜索相应的目标文件(源数据)。
例如:搜索条件 Collector construction
分析后的语汇单元是: Collector、 construction
按照分析后的语汇单元(Collector、 construction)搜索
分词器的使用:
a、StandardAnalyzer 标准分词器
public static void main(String[] args) throws IOException { Analyzer az=new StandardAnalyzer(); //创建分词 TokenStream stream=az.tokenStream("content", "爱我中华 china"); //分词对象重置 stream.reset(); //获得每一个语汇偏移量的属性对象 OffsetAttribute oa=stream.addAttribute(OffsetAttribute.class); //获得分词器的语汇属性 CharTermAttribute ca=stream.addAttribute(CharTermAttribute.class); //遍历分词的语汇 while(stream.incrementToken()){ System.out.println("--------------------------"); System.out.println("开始索引:"+oa.startOffset()+" 结束索引:"+oa.endOffset()); System.out.println(ca); } }
结果:标准分词器对中文的分词是每个字进行分词。
-------------------------- 开始索引:0 结束索引:1 爱 -------------------------- 开始索引:1 结束索引:2 我 -------------------------- 开始索引:2 结束索引:3 中 -------------------------- 开始索引:3 结束索引:4 华 -------------------------- 开始索引:6 结束索引:11 china
b、IKAnalyzer 中文分词器
public static void main(String[] args) throws IOException { Analyzer az=new IKAnalyzer(); //创建分词 TokenStream stream=az.tokenStream("content", "爱我中华"); //重置分词对象 stream.reset(); //获得每一个语汇偏移量的属性对象 OffsetAttribute oa=stream.addAttribute(OffsetAttribute.class); //获得分词器的语汇属性 CharTermAttribute ca=stream.addAttribute(CharTermAttribute.class); //遍历分词的语汇 while(stream.incrementToken()){ System.out.println("--------------------------"); System.out.println("开始索引:"+oa.startOffset()+" 结束索引:"+oa.endOffset()); System.out.println(ca); } }
结果:
-------------------------- 开始索引:0 结束索引:2 爱我 -------------------------- 开始索引:1 结束索引:2 我 -------------------------- 开始索引:2 结束索引:4 中华
来源:https://www.cnblogs.com/jalja/p/6607150.html