1. 1 倒排索引java
将数据加入到索引库(你能够理解成另一个数据库)时,会先提取数据中的词汇(分词),将词汇加入到文档域,文档域中记录了词汇以及词汇在哪条数据记录中出现过的数据下标。用户在搜索数据时,先将用户搜索的数据进行词汇提取,而后把对应词汇拿到索引域中进行匹配查找,查找后会找到对应的下标ID,再根据对应下标ID到文档域中找真实数据.数据库
1.2 应用场景 :apache
一、 单机软件的搜索(word中的搜索)api
二、 站内搜索 (baidu贴吧、论坛、 京东、 taobao)架构
三、 垂直领域的搜索 (818工做网)eclipse
四、 专业搜索引擎公司 (google、baidu)工具
2.1 什么是Lucene优化
Lucene是apache软件基金会 Jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。搜索引擎
2.2 Lucene与搜索引擎的区别google
全文检索系统是按照全文检索理论创建起来的用于提供全文检索服务的软件系统,包括创建索引、处理查询返回结果集、增长索引、优化索引结构等功能。例如:百度搜索、eclipse帮助搜索、淘宝网商品搜索等。
搜索引擎是全文检索技术最主要的一个应用,例如百度。搜索引擎起源于传统的信息全文检索理论,即计算机程序经过扫描每一篇文章中的每个词,创建以词为单位的倒排文件,检索程序根据检索词在每一篇文章中出现的频率和每个检索词在一篇文章中出现的几率,对包含这些检索词的文章进行排序,最后输出排序的结果。全文检索技术是搜索引擎的核心支撑技术。
Lucene和搜索引擎不一样,Lucene是一套用java或其它语言写的全文检索的工具包,为应用程序提供了不少个api接口去调用,能够简单理解为是一套实现全文检索的类库,搜索引擎是一个全文检索系统,它是一个单独运行的软件系统。
3.1 Lucene入门
实现这么一个案例,经过Java代码调用Lucene API实现对索引库的增删改查,索引库数据来源于数据库,因此增长操做须要先从数据库将数据查询出来,再调用Lucene API将数据加入到索引库中。
3.2 Lucene实现全文检索思路
全文检索的流程分为两大部分:索引流程、搜索流程。
4.1 经常使用api介绍及分词
IndexSearcher搜索方法以下:
4.2
5.1 Field属性
Field是文档中的域,包括Field名和Field值两部分,一个文档能够包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。
Field中三个很是重要的属性:
l 是否分词(tokenized)
是,将field的内容分红一个一个单词。分词的目的:分词目的为了索引
例如:商品的名称。
否,不分词,将内容做为一个总体存储。
例如:商品ID 身份证号,图片路径
l 是否索引(indexed)
是,将field的值创建索引,索引的目的:索引的目的为了搜索。
例如:商品的名称
否,不创建索引
例如:图片路径、文件路径等
l 是否存储(stored),存不存取决于查询结果展现不展现
是,存储field的值。存储的目的:(为了展现在页面)
例如:商品名称,图片路径
否,不存储field的值。
例如:商品介绍。若是须要展现,根据ID从数据库查询展现在详情页面。
5.2 Field经常使用类型
下边列出了开发中经常使用 的Filed类型,注意Field的属性,根据需求选择:
Field类 |
数据类型 |
Analyzed 是否分词 |
Indexed 是否索引 |
Stored 是否存储 |
说明 |
StringField(FieldName, FieldValue,Store.YES)) |
字符串 |
N |
Y |
Y或N |
这个Field用来构建一个字符串Field,可是不会进行分词,会将整个串存储在索引中,好比(订单号,身份证号等) 是否存储在文档中用Store.YES或Store.NO决定 |
LongField(FieldName, FieldValue,Store.YES) FloatField(FieldName, FieldValue,Store.YES) |
Long类型Float类型 等等数字类型 |
Y |
Y |
Y或N |
这个Field用来构建一个Long数字型Field,进行分词和索引,好比(价格) 是否存储在文档中用Store.YES或Store.NO决定 |
StoredField(FieldName, FieldValue) |
重载方法,支持多种类型 |
N |
N |
Y |
这个Field用来构建不一样类型Field(图片路径) 不分词,不索引,但要Field存储在文档中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader) |
字符串 或 流 |
Y |
Y |
Y或N |
若是是一个Reader, lucene猜想内容比较多,会采用Unstored的策略. |