搜索引擎介绍
一、数据分类
数据分为结构化数据和非结构化数据两种
- 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等
对于结构化数据,我们常常通过关系型数据库(mysql、oracle等)的table方式进行存储和搜索,还可以建立索引。通过b-tree等数据结构快速搜索数据
- 非结构化数据:全文数据,指不定长或无固定格式的数据,如邮件,文档等
对于非结构化数据,即全文数据的搜索主要有两种方法:顺序扫描法,全文搜索法
顺序扫描:按照顺序扫描的方式查找指定关键字
全文搜索:对于非结构化的数据,顺序扫描很慢。将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定的结构,然后对这些一定结构的数据进行搜索,从而达到相对较快的目的。这就是全文搜索的基本思路。这部分从非结构化数据提取出来,重新组织后的信息,称之为索引
二、全文搜索引擎
全⽂搜索引擎是⽬前⼴泛应⽤的主流搜索引擎。它的⼯作原理是计算机索引程序通过扫描⽂章中的每⼀个词,对每⼀个词建⽴⼀个索引,指明该词在⽂章中出现的次数和位置,当⽤户查询时,检索程序就根据事先建⽴的索引进⾏查找, 并将查找的结果反馈给⽤户的。
三、全文搜索引擎的种类
Lucene:Lucene是⼀个Java全⽂搜索引擎,完全⽤Java编写。Lucene不是⼀个完整的应⽤程序,⽽是⼀个代码库和API,可以很容易地⽤于向应⽤程序添加搜索功能。
通过简单的API提供强⼤的功能
可扩展的⾼性能索引
强⼤,准确,⾼效的搜索算法
跨平台解决⽅案
Apache软件基⾦会
在Apache软件基⾦会提供的开源软件项⽬的Apache社区的⽀持。
但是Lucene只是⼀个框架,要充分利⽤它的功能,需要使⽤java,并且在程序中集成Lucene。需要很多的学习了解,才能明⽩它是如何运⾏的,熟练运⽤Lucene确实⾮常复杂。
solr:Solr是⼀个基于Lucene的Java库构建的开源搜索平台。它以⽤户友好的⽅式提供ApacheLucene的搜索功能。它是⼀个成熟的产品,拥有强⼤⽽⼴泛的⽤户社区。它能提供分布式索引,复制,负载均衡查询以及⾃动故障转移和恢复。如果它被正确部署然后管理得好,它就能够成为⼀个⾼度可靠,可扩展且容错的搜索引擎。随着数据量的增加,Solr的搜索效率会变得更低,适合小的搜索应用。
强⼤的功能
全⽂搜索
突出
分⾯搜索
实时索引
动态群集
数据库集成
NoSQL功能和丰富的⽂档处理
elasticSearch:
基于Lucene的搜索框架,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口,上手容易,拓展节点方便,可用于存储和检索海量数据,接近实时搜索,海量数据量增加, 搜索响应性能几乎不受影响;分布式搜索框架,自动发现节点,副本机制,保障可用性。Elasticsearch的官⽅客户端库提供Java,Groovy,PHP,Ruby,Perl,Python, .NET和Javascript。
主要功能
分布式搜索
数据分析
分组和聚合
四、搜索引擎和关系型数据库对比
关系型数据库只针对结构化数据使用,效果会更好。⼀般传统数据库,全⽂搜索都实现的很鸡肋,因为⼀般也没⼈⽤数据库存⻓⽂本字段,因为进⾏全⽂搜索的时候需要扫描整个表,如果数据量⼤的话即使对SQL的语法进⾏优化, 也是效果甚微。即使建⽴了索引,但是维护起来也很麻烦,对于insert和update操作都会重新构建索引。
全⽂索引搜索很好的⽀持⾮结构化数据的搜索,可以更好地快速搜索⼤量存在的任何单词⾮结构化⽂本。例如Google,百度类的⽹站搜索,它们都是根据⽹⻚中的关键字⽣成索引,我们在搜索的时候输⼊关键字, 它们会将该关键字即索引匹配到的所有⽹⻚返回;还有常⻅的项⽬中应⽤⽇志的搜索等等。对于这些⾮结构化的数据⽂本,关系型数据库搜索不是能很好的⽀持。
mysql的搜索是使用like的方式进行搜索,如果数据量大的情况效率很低,如果甚至是包含查询,是不走数据库索引。
灵活的搜索能力
如果我们想查出名字叫james的球员,但是⽤户输⼊了jame,我们想提示他⼀些关键字如果我们想查出带有"冠军"关键字的⽂章,但是⽤户输⼊了"总冠军",我们也希望能查出来。
如果我们想查出带有"冠军"关键字的⽂章,但是⽤户输⼊了"总冠军",我们也希望能查出来。
五、适合全⽂索引引擎的场景
搜索的数据对象是⼤量的⾮结构化的⽂本数据。
⽂本数据量达到数⼗万或数百万级别,甚⾄更多。
⽀持⼤量基于交互式⽂本的查询。
需求⾮常灵活的全⽂搜索查询。
对安全事务,⾮⽂本数据操作的需求相对较少的情况。
