网站首页 > java教程 正文
在现在互联网如日中天的时代,即使你不是互联网行业的人,你也一定会用过谷歌或者百度。因为他们已经影响了我们生活的方方面面,为我们提供了很多的便利。那么在互联网行业的人我们除了使用它们,我们还迫切地想知道它们到底是怎么实现的。
以谷歌和百度为例子。它们都称之为搜索引擎。虽然听起来比较高大上。但实际上他们就是搜索数据用的。但站在数据方面考虑,实际上数据会分为两种:结构化数据和非结构化数据。
- 结构化数据:简单来说,就是有固定格式固定长度的的数据。平常比较常见的例如Mysql、Oracle数据库等。
- 非结构化数据:反之,就是无固定格式和长度的数据。例如比较常见的是:Email和文档数据。
按照这两种数据的划分,他们在搜索上也有很大的不同。结构化数据我们可以建立数据库索引来快速的搜索数据。而非结构化的数据搜索。我们主要有两种方式。一种是顺序扫描法,另一种是全文搜索法。下面我们详细介绍一下这两种的区别。
- 顺序扫描法
顺序扫描法顾名思义,就是按照数据的顺序一步一步地找。找到一个然后就记录该位置。直到所有的数据都要扫描完,才知道要查找的内容都在哪些位置出现过。但这明显有相应的弊端。如果要查找的内容碰巧在数据的最后。那么该方法需要扫描所有的数据,但这之前扫描的数据均无效。这就造成了很大的资源浪费。
- 全文搜索法
既然我们已经知道顺序扫描法的弊端,那我们应该怎么进行优化呢?因为这样的数据是非结构化的数据。没有办法像结构化的数据做索引来达到快速检索的目的。那我们到底应该怎么办呢?答案很简单。逆向思维。既然非结构化的数据没办法做到,那我们把他们改成结构化的数据不就行了吗。这里改成结构化的数据,并不是将全部的数据都改成结构化。这样将毫无意义。而是将要搜索的内容按照某种方式,做成结构化的数据,然后将结构化的数据创建索引,接着我们在通过这些结构化的索引,来搜索相关非结构化的内容。这就是全文搜索的基本原理。
就像我们在淘宝搜索手机一样,淘宝并不会将所有的数据都按照结构化存储,而是将相应的关键字,按照结构化存储即可。这样当我们命中关键字时,就可以搜索出来我们想要内容。也正是因为这些,所以常常有些人在搜索的时候,喜欢输入很多的修饰词,适当的修饰词是可以准确地帮助我们,找到我们想要的内容,但如果修饰词过多的话,并不会达到我们想要的,因为他检索的本质是命中关键词。这也就是为什么有时我们搜索时,明明加了很多修饰词,居然和我们没有加修饰词搜索出来的内容是一样的原因。
所以谷歌和百度搜索引擎的基本原理就是:网络机器人或者网络蜘蛛通过扫描网页中的内容,提取出相应的关键词,然后为提取出的关键词建立索引,并记录该关键词在文章中位置,当用户搜索时,如果命中该关键词,搜索引擎就根据按照之前的索引进查找,这样可以很快的返回用户想要的数据内容。
下面我们介绍一下现在比较常见的搜索引擎,并介绍详细介绍一下它们之间的区别。
- Lucene:它归属于Apache软件基金会。它是一个全文检索引擎工具包,所以它并不是一个全文检索引擎。既然是工具包,所以它提供了强大的API功能例如:
- 可扩展的高高性能索引
- 强大大,准确,高高效的搜索算法
- 跨平台解决方方案
由于它只是一个全文检索引擎工具包,所以在使用时,需要我们自行编码。虽然现在也支持了多种语言,但最成熟的开源版本,还是Java。所以要想使用它,我们需要Java的编程基础。
- Solr:它是一个独立的企业级搜索应用服务器,Solr是基于Lucene的Java库构建的开源搜索平台。并提供了HTTP的方式,创建索引和查询数据。除此之外,它还提供了以下比较高级的功能:
- 全文文搜索
- 分面面搜索
- 实时索引
- 动态群集
- Elasticsearch:它也是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch也是用Java语言开发的。它和Solr一样,除了基本的数据检索功能外,也提供了以下高级的功能:
- 分布式搜索
- 数据分析
- 分组和聚合
下面我们介绍一下,为什么会出现搜索引擎技术,而不是用传统的数据库去实现此功能。
我们知道如果采用传统的数据库,我们可能通过创建索引的方式,去优化我们的查询速度。并且,我们还知道,如果在数据量比较大的话,还可以采用分库分表的方式继续优化。那为什么还会出现类似Elasticsearch这样的搜索引擎技术呢?答案就像我上面介绍的那样。搜索引擎并不会将所有的数据全部按照结构化存储,而是按照相应的关键字存储。并且按照现在的网页数据,不同的网站,内容大不相同,如果采用结构化存储,那么在数据库设计上很难实现。除此之外,我们知道,在数据库中要想快速的查询数据,那么必须要创建相应的索引,但我们在使用SQL语法时,尝尝会因为我们使用不当,或者某些特定的方式,命中不到索引,这就导致使用数据库检索时,会比较慢。比较常见的就是。例如我们在数据库中搜索指定的关键字,并且该关键字的字段我们创建了索引,所以在搜索时,查询的速度很快,因为它命中了索引。但在实际的应用场景中,我们并不会正好输入的关键字就是数据库中存储的,而是采用的是模糊搜索的方式。而在数据库中要想使用模糊搜索,则要使用like关键字。但在使用like关键字时,则索引会失效。除此之外,我们在数据库中创建索引时,并不是越多越好。因为如果索引过多的话,则会影响inster和update的性能。所以,正是因为数据库有种种这样的原因,才会出现全文搜索引擎存在的必要。
下面我们介绍一下全文搜索引擎比较适合的应用场景都有哪些:
- 搜索数据比较大的非结构化数据。
- 支持文本数据量达百万级别。
- 支持交互式文文本的查询。
- 对写需求比较少的需求,因为全文检索的核心目的就是查询。
以上内容就是本篇的全部内容,在接下来的文章中,我们将重点更新有关Elasticsearch相关的内容,欢迎大家支持,谢谢。
- 上一篇: 线程池中各个参数如何合理设置
- 下一篇: 不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
猜你喜欢
- 2025-01-21 迷宫搜索类的双向bfs问题(例题详解)
- 2025-01-21 启动应用时出现Cannot allocate memory
- 2025-01-21 好热啊,来个冷笑话凉快凉快吧
- 2025-01-21 不努力提高效率,小姐姐都被人追走了:K8S一键部署了解一下?
- 2025-01-21 线程池中各个参数如何合理设置
- 2025-01-21 java Math类和Random类的用法
- 2025-01-21 「offerMe——刷题必备」java如何实现开根号的运算
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)