### 前⾔ 有⼈可能会问,为什么⼀定要⽤搜索引擎呢?我们的所有数据不是都可以放在数据库⾥吗?⽽且 Mysql,Oracle,SQL Server 等数据库⾥不是也能提供查询搜索功能,直接通过数据库查询不就可以了吗? ### 确实,我们⼤部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过新建数据库索引,优化SQL等⽅式进⾏提升效率,甚⾄通过引⼊缓存⽐如redis,memcache来加快数据的返回速度。如果数据量更⼤,还可以通过分库分表来分担查询压⼒。那为什么还要全⽂搜索引擎呢?我们从⼏个⻆度来说。 ### ### 数据类型 全⽂索引搜索很好的⽀持⾮结构化数据的搜索,可以更好地快速搜索⼤量存在的任何单词⾮结构化⽂本。例如Google,百度类的⽹站搜索,它们都是根据⽹⻚中的关键字⽣成索引,我们在搜索的时候输⼊关键字,它们会将该关键字即索引匹配到的所有⽹⻚返回;还有常⻅的项⽬中应⽤⽇志的搜索等等。对于这些⾮结构化的数据⽂本,关系型数据库搜索不是能很好的⽀持。 ### ### 搜索性能 如果使⽤mysql做搜索,⽐如有个player表,这个表有user\_name这个字段,我们要查找出user\_name以james开头的球员,和含有James的球员。我们⼀般怎么做?数据量达到千万级别的时候怎么办? `select * from player where user_name like 'james%';` ### ### 灵活的搜索 ### 如果我们想查出名字叫james的球员,但是⽤户输⼊了jame,我们想提示他⼀些关键字 ### ![](https://img.kancloud.cn/5f/08/5f08c1efd057e60bad7569ec480e59d1_641x142.png) ### 如果我们想查出带有"冠军"关键字的⽂章,但是⽤户输⼊了"总冠军",我们也希望能查出来。 ### ![](https://img.kancloud.cn/79/01/79010f69d3ba060a315311e32763b268_657x281.png) ### ### 索引的维护 ### ⼀般传统数据库,全⽂搜索都实现的很鸡肋,因为⼀般也没⼈⽤数据库存⻓⽂本字段,因为进⾏全⽂搜索的时候需要扫描整个表,如果数据量⼤的话即使对SQL的语法进⾏优化,也是效果甚微。即使建⽴了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。 ### ### 适合全⽂索引引擎的场景 1. 搜索的数据对象是⼤量的⾮结构化的⽂本数据。 3. ⽂本数据量达到数⼗万或数百万级别,甚⾄更多。 5. ⽀持⼤量基于交互式⽂本的查询。 7. 需求⾮常灵活的全⽂搜索查询。 9. 对安全事务,⾮⽂本数据操作的需求相对较少的情况。