一、介绍
通过建立数据库数据索引,当用户查找时通过索引查找数据,减轻服务器压力,提高搜索效率(全文检索引擎工具包)
全文索引:
索引流程:获取数据库内容,建立词语与数据库数据的对应关系(索引库)
1、获取原始数据(JDBC操作获取到关系数据库中的业务数据)
2、创建文档对象(Document——一个文档对象相当于数据库中的一行记录),一个文档对象包含多个域(Field——每个域都是数据库中对应的字段)
3、使用分词器分析(ik分词器)
4、建立索引(写出索引文件)
检索流程:通过检索程序,根据搜索关键词在索引库中查找目标内容
1、输入查询关键字搜索查询
2、建立查询对象
3、执行查询
4、返回结果集
通过倒排索引法查找数据(新华字典查找)
1、建立倒排索引,就是建立词语与文件的对应关系(搜索内容在那个文件中出现,出现了几次,在什么位置出现)
2、搜索的时候,直接根据搜索关键词,在倒排索引中找到目标内容
二、分词器
分词器,即将一句话,一段文字分成对应的词语,文字(算法不一样则分词效果也不一样)
中文分词器:
一元分词器(StandardAnalyzer):将数据分成单个文字(中国人:中,国,人)
二元分词器(CJKAnalyzer):将数据分成两两组合的词语(中国人:中国,国人)
词典分词器(SmartChineseAnalyzer):按照基本的语意进行分词(中国人:中国,中国人,国人)
IK分词器(IK-analyzer):在以Lucene分词为基础,可以对分词进行扩展,添加需要的分词,过滤不需要的分词等(需要引入依赖jar包,添加配置文件)
添加:当有个别无法识别的词语时,需要手动添加(东标方准)
过滤:去除一些不需要分词的标点符号、字、词等(嗯、啊、呀、哦、is、am、and),也可以将词的大写转换成小写
<!--依赖jar包--><dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version></dependency><!--xml配置文件(文件名固定:IKAnalyzer.cfg.xml)--><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典,名称自定义 --><entry key="ext_dict">ext.dic;</entry><!--用户可以在这里配置自己的扩展停止词字典,名称自定义--><entry key="ext_stopwords">stopword.dic;</entry></properties>
**
三、域对象(Field)
域对象特性:
分词(tokenized):是否对域对象的值进行分词处理(商品名称需要搜索则需要分词;商品编号是一个整体,分词后没有意义,则不需要分词)
索引(indexed):将域对象中的内容进行分词处理后得到的词或整体域对象内容建立索引,存储到索引域(需要用来当做查询条件的域对象都需要建立索引,不需要作为查询条件的不建立索引)
存储(stored):是否将域对象的值保存到文档中(凡是需要在搜索结果页面展现个用户的内容都需要存储;内容多格式大不需要在搜索结果页面展现的都不做存储——需要的时候再从关系数据库中取)
常用域对象种类:StringField(FieldName,FieldValue,Store.YES)
数据类型:字符串类型
是否分词:不分词(身份证号、商品编号)
是否索引:需要索引
是否存储:可选择是否存储(Store.YES—是;Store.NO—否)
LongField/DoubleField(FieldName,FieldValue,Store.YES)
数据类型:数值类型
是否分词:需要分词(价格)
是否索引:需要索引
是否存储:可选择是否存储(Store.YES—是;Store.NO—否)
StoredField(FieldName,FieldValue)
数据类型:重载方法,支持多类型
是否分词:不分词
是否索引:不需要索引
是否存储:需要存储(商品图片)
TestField(FieldName,FieldValue,Store.NO
数据类型:文本类型
是否分词:需要分词
是否索引:需要索引
是否存储:可选择是否存储(Store.YES—是;Store.NO—否)
四、程序执行
(一)建立索引
1、读取原式数据(数据库读取)
2、创建文档对象(Document)、域对象(Field),并把域对象添加到文档中
3、创建分词器(Analyzer)——ik分词器
4、创建索引库配置对象(IndexWriterConfig),配置索引库——传入版本和分词器
5、设置索引库打开方式(OpenModel)
6、创建索引库目录对象(FSDirectory),指定索引库存放目录
7、创建索引库操作对象(IndexWriter),将文档写入到索引库中
8、提交事务(commit)
9、释放资源(close)
(二)检索索引
1、创建索引库目录对象(FSDirectory),指定索引库目录
2、创建索引库读取对象(DirectoryReader),指定把索引库数据读取到内存中
3、创建索引库搜索对象(IndexSearcher),用于搜索索引库
4、创建分词器(Analyzer),用于搜索条件分词
5、创建查询解析器(QueryParse),传入分词器并指定查询的域
6、创建查询对象(Query),指定查询条件
7、使用索引库搜索对象(IndexSearcher)执行搜索,返回搜索结果(TopDocs)
8、处理结果集
9、关闭资源(close)
(三)添加索引
1、读取原式数据(数据库)
2、创建文档对象(Document)、域对象(Field),并把域对象添加到文档对象中
3、创建分词器(Analyzer),用于分词
4、创建索引库配置对象(IndexWriterConfig),配置索引库(传入分词器)
5、创建索引库目录对象(FSDirectory),指定索引库的目录
6、创建索引库操作对象(IndexWriter),用于把文档写入到索引库中
7、提交事务(commit)
8、释放资源(close)
(四)删除索引
1、创建分词器(Analyzer)
2、创建索引库配置对象(IndexWriterConfig)
3、创建索引库目录对象(FSDirectory),关联索引库
4、创建索引库操作对象(IndexWriter)
5、创建条件对象(Term)
6、使用索引库操作对象(IndexWriter),根据条件(Term)删除索引
7、提交事务(commit)
8、释放资源(close)
(五)修改索引
1、创建分词器(Analyzer)
2、创建索引库配置对象(IndexWriterConfig)
3、创建索引库目录对象(FSDirectory),并管理索引库
4、创建索引库操作对象(IndexWriter)
5、创建文档(Document),添加域对象
6、创建修改条件(Term)
7、使用索引库操作对象(IndexWriter),根据条件(Term)修改文档(Document)
8、提交事务(commit)
9、释放资源(close)
(六)查询索引
1、创建索引库目录对象(FSDirectory),指定索引库目录
2、创建索引库读取对象(DirectoryReader),指定把索引库数据读取到内存中
3、创建索引库搜索对象(IndexSearcher),用于搜索索引库
4、创建分词器(Analyzer),用于搜索条件分词
5、创建查询解析器(QueryParse),传入分词器并指定查询的域
6、使用QueryParse对象创建查询对象(Query),指定查询条件
7、使用索引库搜索对象(IndexSearcher)执行搜索,返回搜索结果(TopDocs)
8、处理结果集
9、释放资源(close)
(七)Query子类查询
常用子类:
TermQuery:不使用分词器,直接对条件进行精确查询
NumericRangeQuery:查询数字范围
BooleanQuery:拼接多个条件查询
MUST:相当于and
SHOULD:相当于or
MUST_NOT:必须没有
