什么是搜索
简单的说,搜索就是搜寻、查找,在IT行业中就是指用户输入关键字,通过相应的算法,查询并返回用户所需要的信息。
普通的数据库搜索
类似:select * from 表名 where 字段名 like ‘%关键字%’
例如:select * from article where content like ’%here%’ 结果: where here shere
类似:select * from 标名 where 字段名 like ‘%关键字%’
例如:select * from article where content like '%here%'
结果:where here shere
数据量小时候 ,使用模糊查询可以很快速的获取结果
但是如果数据量大呢?
普通的数据库模糊搜索的缺陷
- 由于模糊查询sql是无法使用索引的 ,数据量大的时候查询是很慢的
- 由于查询速度慢,前端等待可能会很久,处理不好可能会造成“卡死”
- 搜索效果比较差,只能对用户输入的完整关键字首尾位进行模糊匹配。用户搜索的结果误多输入一个字符,可能就导致查询出的结果远离用户的预期(如百度透视分析表格)
索引和全文检索概述
全文检索(Full-text Search):
将数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从数据中提取出的然后重新组织的信息,我们称之索引。
例如:字典。
比如‘打’ 字,他有提手旁,拼音为da;提手旁和da就是‘打’字索引
这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
Lucene的简单介绍
Lucene简单来说,是一套用于全文检索和搜寻的开源程式库 ,提供了一套完整的工具来帮助开发者构建自己的搜索引擎,开发者只需要import Lucene对应的package即可快速地开发构建自己的业务搜索引擎。
Lucene中的基本概念
- 索引(Index):文档的集合组成索引。和一般的数据库不一样,Lucene不支持定义主键,但Solr支持。
- 段(segment):为了方便索引大量的文档,一个索引会分成若干个子索引,这些叫做段
- 文档(Document):代表索引库中的一条记录。一个文档可以包含多个列(Field)。 和一般的数据库不一样,一个文档的一个列可以有多个值。例如一篇文档既可以属于互联网类,又可以属于科技类。
- 列(Field):命名的词的集合。
- 词(Term) :由两个值定义——词语和这个词语所出现的列,为经过分词器将列加工(去除标点、字母转小写等)之后得到。
- 存储索引的结构:倒排索引,倒排索引是基于词(Term)的搜索,也就是说Lucene是基于词去搜索的
全文检索过程
全文检索大体分两个过程,索引创建 (Indexing) 和 搜索索引 (Search)
创建索引:获取文档->构建document对象->分词->创建索引
搜索索引:用户查询->创建查询->执行查询->渲染结果->返回数据