有人可能会问,为什么一定要用搜索引擎呢?我们的所有数据不是都可以放在数据库里吗?而且 Mysql,Oracle,SQL Server 等数据库里不是也能提供查询搜索功能,直接通过数据库查询不就可以了吗?
确实,我们大部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过新建数据库索引,优化SQL等方式进行提升效率,甚至通过引入缓存比如redis,memcache来加快数据的返回速度。如果数据量更大,还可以通过分库分表来分担查询压力。那为什什么还要全文搜索引擎呢?从几个角度来说
- 数据类型
全文索引搜索很好的支持非结构化数据的搜索,可以更好地快速搜索大量存在的任何单词非结构化文本。例如 Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据⽂文本,关系型数据库搜索不是能很好的支持
- 搜索性能
如果使用mysql做搜索,比如有个player表,这个表有user_name这个字段,我们要查找出user_name以james开头的球员,和含有James的球员。我们一般怎么做?数据量达到千万级别的时候怎么办?
select * from player where user_name like 'james%';
select * from player where user_name like '%james%';
- 灵活的搜索
如果我们想查出名字叫james的球员,但是用户输入了了jame,我们想提示他一些关键字
如果我们想查出带有"冠军"关键字的文章,但是用户输入了"总冠军",我们也希望能查出来
- 索引的维护
一般传统数据库,全文搜索都实现的很鸡肋,因为一般也没人用数据库存长文本字段,因为进行全文搜索的时候需要扫描整个表,如果数据量大的话即使对SQL的语法进行优化,也是效果甚微。即使建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引
适合全文索引擎的场景
- 搜索的数据对象是大量的非结构化的文本数据
- 文本数据量达到数十万或数百万级别,甚至更多
- 支持大量基于交互式文本的查询
- 需求非常灵活的全文搜索查询
- 对安全事务,非文本数据操作的需求相对较少的情况