全文搜索引擎知识点

什么是全文搜索引擎?

何为搜索,何为全文搜索

常用的搜索网站,比如百度,谷歌

数据的分类

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

​ 对于结构化数据,我们一般都可以通过关系型数据库(MySQL、Oracle等)的table的方式存储和搜索,也可以建立索引。通过b-tree等数据结构快速搜索数据

​ 对于非结构化数据,也即对全文数据的搜索主要有两种方法:顺序扫描法,全文搜索

顺序扫描

按字面意思,我们可以了解它的大概搜索方式,就是按照顺序扫描的方式查找特定的关键字。比如让你在一片篮球新闻中,找出“科比”这个名字在哪些段落出现过。那你肯定需要从头到尾把文章阅读一遍,然后标记出关键字在哪些地方出现过

这种方法毋庸置疑是最低效的,如果文章很长,有几万字,都能你阅读完这篇新闻找到“科比”这个关键字,需要花费很长时间

全文搜索

对于非结构化数据进行扫描顺序很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了么。将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对这些有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这种方式就构成了全文搜索的基本思路。这部分从非结构化数据提取出的然后重新组织的信息,我们称之为**“索引”**

我们以NBA中国网站为例,假设我们都是篮球爱好者,并且我们都是科密,那如何快速找到有关科比的新闻呢?全文搜索的方式就是将所有新闻中所有的关键字进行提取,比如“科比”“詹姆斯”“总冠军”“MVP”等关键字,然后对这些关键字建立索引,通过索引我们就可以找到的该关键字出现的新闻了

什么是全文搜索引擎?

根据百度百科中的定义,全⽂搜索引擎是⽬前⼴泛应⽤的主流搜索引擎。它的⼯作原理是计算机索引程序通过扫描⽂章中的每⼀个词,对每⼀个词建⽴⼀个索引,指明该词在⽂章中出现的次数和位置,当⽤户查询时,检索程序就根据事先建⽴的索引进⾏查找,并将查找的结果反馈给⽤户的。

为什么不用MySQL做全文搜索?

有人可能会问,为什么一定要用搜索引擎呢?我们的所有数据不是都可以放在数据库里么?

而且Mysql、Oracle、SQL Server等数据库里不是也提供查询搜索功能,直接通过数据库查询不就可以了么?

确实,我们大部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过新建数据库索引,优化SQL等方式进行提升效率,甚至通过引入缓存来加快数据的返回速度,如果数据量更大,还可以通过分库分表来分担查询压力

那为什么还要全文搜索引擎呢?

数据类型

全文搜索很好的支持非结构化数据的搜索,可以更好地搜索大量存在的任何单词非结构化文本。比如Goole,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到所有网页返回;还有常见的项目中应用的日志的搜索等。对于在这些非结构化的数据文本,关系型数据库搜索不是很好的支持,因为效率低、且索引需要维护

搜索性能

如果使用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操作都会重新构建索引

适合全文索引引擎的场景

1.搜索的数据对象是大量的非结构化文本数据

2.文本数据量达到十万或数百文级别,甚至更多

3.支持大量基于交互式文本的查询

4.需求非常灵活的全文搜索查询

5.对安全事务,非文本数据操作的需求相对较少的情况(读多写少)

常见的搜索引擎

Lucene

Lncene是一个java全文搜索引擎,完全用java编写。Luncene不是一个完整的应用程序,而是一个代码库和API,可以很容易的用于向应用程序添加搜索功能

通过简单的API提供强大功能

​ 可扩展的高性能索引
​ 强大,精准,高效的搜索算法
​ 跨平台解解决方案

Apache软件基金会

​ 在Apache软件基金会提供的开源软件项目的Apache社区的支持
​ 但是Lucene只是一个框架,要充分利用它的功能,需要使用java,并且在程序中集成Lucene,需要很多的学习了解,才能明白它是如何运行的,熟练运用Lucene确实非常复杂

Solr

Solr是⼀个基于Lucene的Java库构建的开源搜索平台。它以⽤户友好的⽅式提供ApacheLucene的搜索功能。它是⼀个成熟的产品,拥有强⼤⽽⼴泛的⽤户社区。它能提供分布式索引,复制,负载均衡查询以及⾃动故障转移和恢复。如果它被正确部署然后管理得好,它就能够成为⼀个⾼度可靠,可扩展且容错的搜索引擎。很多互联⽹巨头,如Netflflix,eBay,Instagram和亚⻢逊都使⽤Solr,因为它能够索引和搜索多个站点。

强大的功能
全文搜索、突出、分面搜索、实时索引、动态群集、数据库集成、NoSQL功能和丰富的文档处理

Elasticsearch

Elasticsearch是一个开源,是一个基于Apache Lucene库构建的Restful搜索引擎

Elasticsearch是在Solr之后⼏年推出的。它提供了⼀个分布式,多租户能⼒的全⽂搜索引擎,具有HTTP Web界⾯(REST)和⽆架构JSON⽂档。Elasticsearch的官⽅客户端库提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript。

主要功能

​ 分时搜索、数据分析、分组和聚合

应用场景

​ 维基百科、Stack Overflow、GitHub、电商网站、日志数据分析、商品价格监控网站、BI系统、站内搜索、篮球论坛

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/115221948