常用搜索引擎包括哪些类型(常用的搜索引擎有哪些类型)

前沿拓展:

常用搜索引擎包括哪些类型

PC端,多用百度搜索引擎、360搜索引擎和搜狗搜索引擎。
移动端,多用百度搜索引擎和神马搜索引擎。


Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助!

RedisMod简介

首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:

RediSearch:一个功能齐全的搜索引擎;RedisJSON:对JSON类型的原生支持;RedisTimeSeries:时序数据库支持;RedisGraph:图数据库支持;RedisBloom:概率性数据的原生支持;RedisGears:可编程的数据处理;RedisAI:机器学习的实时模型管理和部署。安装

首先我们需要安装带所有RedisMod的Redis,使用Docker来安装非常方便的!

使用如下命令下载RedisMod的镜像;docker pull redislabs/redismod:preview在容器中运行RedisMod服务。docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:previewRedisJSON

有了RedisJSON模块,Redis就可以存储原生JSON类型数据了,通过它你可以很方便地访问JSON中的各个属性,类似在MongoDB中那样,下面我们就来体验下,这里我们将使用RedisInsight 来操作Redis。

首先通过JSON.SET命令向Redis中添加JSON类型键值对,几个商品对象数据,由于JSON是树形结构的,使用$符号代表往JSON的根节点中添加数据;JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"红米5A","subTitle":"全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 红色特别版 移动联通电信4G手机","brandName":"苹果","price":5499,"count":10}'数据插入成功后,在RedisInsight中将看到如下信息,JSON数据支持格式化高亮显示;比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

接下来可以通过JSON.GET命令获取JSON类型键值对的值;JSON.GET product:1比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;JSON.GET product:1 .name .subTitle比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

还可以通过JSON.TYPE命令来获取JSON对象类型。JSON.TYPE product:1 .比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

RediSearch

通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!

使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;FT.CREATE {index}
[ON {data_type}]
[PREFIX {count} {prefix} [{prefix} ..]
[LANGUAGE {default_lang}]
SCHEMA {identifier} [AS {attribute}]
[TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
[SORTABLE] [NOINDEX]] ...使用FT.CREATE命令可以建立索引,语法中的参数意义如下;index:索引名称;data_type:建立索引的数据类型,目前支持JSON或者HASH两种;PREFIX:通过它可以选择需要建立索引的数据前缀,比如PREFIX 1 "product:"表示为键中以product:为前缀的数据建立索引;LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;identifier:指定属性名称;attribute:指定属性别名;TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;SORTABLE:指定属性可以进行排序。看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG建立完索引后,我们就可以使用FT.SEARCH对数据进行查看了,比如使用*可以查询全部;FT.SEARCH productIdx *比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息;FT.SEARCH productIdx * SORTBY price DESC比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

还可以指定返回的字段;FT.SEARCH productIdx * RETURN 3 name subTitle price比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米或苹果的商品;FT.SEARCH productIdx '@brandName:{小米 | 苹果}'比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

由于price是NUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;FT.SEARCH productIdx '@price:[500 1000]'比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;FT.SEARCH productIdx '@name:小米*'比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

在FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;FT.SEARCH productIdx '黑色'比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;FT.SEARCH productIdx '@subTitle:红色'比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;FT.DROPINDEX productIdx通过FT.INFO命令可以查看索引状态;FT.INFO productIdx比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考下表。比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

对比Elasticsearch

Redis官方曾公布了RediSearch与Elasticsearch的性能对比测试,大家可以看下。

索引能力

对Wikipedia的560万(5.3GB)文档进行索引,RediSearch耗时221s,Elasticsearch耗时349s,RediSearch快了58%!

比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

查询能力

数据建立索引后,使用32个客户端对两个单词进行检索,RediSearch的吞吐量达到12.5K ops/sec,Elasticsearch的吞吐量为3.1K ops/sec,RediSearch比Elasticsearch要快4倍。同时RediSearch的延迟为8ms,而Elasticsearch为10ms,RediSearch延迟稍微低些!

比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸

总结

经过这么多年的发展,Redis的功能也越来越强大了,它已经不仅仅是个缓存工具了,更像是一个数据库了。RediSearch给了我们实现搜索功能的另一个选择,性能也非常不错,大家如果做搜索相关功能的话可以考虑下它!

拓展知识:

常用搜索引擎包括哪些类型

搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。
全文索引
搜索引擎分类部分提到过全文搜索引擎从网站提取信息建立网页数据库的概念。搜索引擎的自动信息搜集功能分两种。一种是定期搜索,即每隔一段时间(比如Google一般是28天),
蜘蛛搜索引擎
搜索引擎主动派出“蜘蛛”程序,对一定IP地址范围内的互联网网站进行检索,一旦发现新的网站,它会自动提取网站的信息和网址加入自己的数据库。另一种是提交网站搜索,即网站拥有者主动向搜索引擎提交网址,它在一定时间内(2天到数月不等)定向向你的网站派出“蜘蛛”程序,扫描你的网站并将有关信息存入数据库,以备用户查询。随着搜索引擎索引规则发生很大变化,主动提交网址并不保证你的网站能进入搜索引擎数据库,最好的办法是多获得一些外部链接,让搜索引擎有更多机会找到你并自动将你的网站收录。
当用户以关键词查找信息时,搜索引擎会在数据库中进行搜寻,如果找到与用户要求内容相符的网站,便采用特殊的算法——通常根据网页中关键词的匹配程度、出现的位置、频次、链接质量——计算出各网页的相关度及排名等级,然后根据关联度高低,按顺序将这些网页链接返回给用户。这种引擎的特点是搜全率比较高。
目录索引
目录索引也称为:分类检索,是因特网上最早提供WWW资源查询的服务,主要通过搜集和整理因特网的资源,根据搜索到网页的内容,将其网址分配到相关分类主题目录的不同层次的类目之下,形成像图书馆目录一样的分类树形结构索引。目录索引无需输入任何文字,只要根据网站提供的主题分类目录,层层点击进入,便可查到所需的网络信息资源。
虽然有搜索功能,但严格意义上不能称为真正的搜索引擎,只是按目录分类的网站链接列表而已。用户完全可以按照分类目录找到所需要的信息,不依靠关键词(Keywords)进行查询。