Skip to content

搜索引擎介绍

一、数据分类

数据分为结构化数据和非结构化数据两种

  • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等

对于结构化数据,我们常常通过关系型数据库(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,我们想提示他⼀些关键字如果我们想查出带有"冠军"关键字的⽂章,但是⽤户输⼊了"总冠军",我们也希望能查出来。

  • 如果我们想查出带有"冠军"关键字的⽂章,但是⽤户输⼊了"总冠军",我们也希望能查出来。

五、适合全⽂索引引擎的场景

  • 搜索的数据对象是⼤量的⾮结构化的⽂本数据。

  • ⽂本数据量达到数⼗万或数百万级别,甚⾄更多。

  • ⽀持⼤量基于交互式⽂本的查询。

  • 需求⾮常灵活的全⽂搜索查询。

  • 对安全事务,⾮⽂本数据操作的需求相对较少的情况。