`

如何使用redis搭建简单的搜索引擎

阅读更多

前言

 

提到搭建搜索引擎,最容易想到的是使用ESElasticsearch),但有些时候由于资源原因某些项目有可能没有ES资源。也有可能项目太小没必要引入ES,这时大家的普遍做法还是使用关系型数据库查询代替。

 

现在redis已经广泛的运用于大大小小的项目,有的项目使用redis做缓存(全局共享缓存),有的项目直接代替关系型数据库用于持久层。在这些使用redis的项目中,如果没有ES资源,其实可以使用redis来实现简单的搜索引擎功能。

 

使用redis做搜索引擎的可行性

 

倒排索引

搜索引擎能保证高性能全文检索的首要因素,就是建立和使用“倒排索引”。“倒排索引”与其说是索引,不如说是一种数据结构:由文档中所有的“可用词”列表构成,每个“可用词”对应一个“文档”列表,这个“文档”列表中的每个文档里包含这个“可用词”。

 

理解起来有点绕,首先来看下上述描述中的两个术语:

文档:就是一段文本,可以是一句话,也可以是一篇文章。用文档id,唯一标识一个文档。

可用词:简单的理解就是能表示“文档”内容特征的单词,相对的还有非可用词” 也就是在构成文档的辅助词。比如“我是地球人”,这里的都是非可用词地球地球人是“可用词”。

 

换句话说:文档=可用词+非可用词。理解了这两个术语,再来看倒排索引的创建过程:其实就是对每个文档进行分词,取出该文档中的“可用词列表”,并把这个文档id放入该“可用词列表”中每个可用词对应的集合中。讲到这里是不是会突然想到redis5种数据结构中的set(集合)

 

分词

其实就是从文档中提取可用词列表的过程,英文的单词提取很简单以空格间隔就行。但中文不行,一般会采用一些分词工具,比如现在比较流行的Ik。但对于一个简单搜索引擎来说,查询关键字也许就是固定的几个单词,引入分词工具有时不是很必要。此时只需要维护一个 公共可用词列表即可。

 

引入redis

 

搜索引擎的关键其实就是创建倒排索引,前面提到倒排索引一般是由多个可用词对应的文档集合构成,在redis中巧好有set(集合)、zset(排序集合)两种数据类型可以用于存储倒排索引,由于搜索引擎一般都需要根据权重进行复合排序,使用zset存储更加适合。下面以一个真实的案例进行讲解,如何使用redis创建倒排索引

 

在笔者所在的活动页管理系统中,需要根据“用户画像”实现猜你喜欢的“活动页”列表功能。“用户画像”信息(不是本主题讲解的重点)可以通过接口获得,比如张三的用户画像信息为:{品牌:阿迪达斯,分类:服装},用户画像信息很多 这里这是为了示例演示,只取用户喜欢的品牌分类。其中阿迪达斯服装就是搜索关键词。

 

搜索关键词有了,现在来看使用redis实现倒排索引的创建。在创建活动页时,一般会有活动页的基本信息,比如:活动id、活动名称、页面链接、活动描述、 分类品牌更新时间等信息。活动信息使用redishash进行存储(这里假设只有三个活动页):

 




如果要实现全文检索,一般会对“活动名称”和“活动描述”进行分词,但我们只是为了简单的复合查询,暂时不需要引入分词工具(如果要做也是可以的)。这里简单的设置三个公共可用词:分类、品牌、更新时间,分别对应三个redis 排序集合zset。每当一个新活动页”被创建时会经历下列过程,以完成倒排索引创建。

 

首先创建“分类”对应的zset集合,集合的成员是页面id(文档id),分值是这个活动页的评分,主要用于排序,这个评分是通过一定算法计算出来。这里有两个分类,分别对应两个zset集合:



 

然后创建“品牌”对应的zset集合,成员和分值含义与分类集合中相同。这里有两个品牌,对应创建两个zset集合:

 

 

最后创建更新时间对应的zset集合,成员是页面id(文档id),分值是对应页面的更新时间。只需创建一个集合即可:



到这里“倒排索引”创建完成。

 

执行查询以及复合排序

 

现在要执行查询,查询条件就是用户画像信息:{品牌:阿迪达斯,分类:服装}(通过接口获得)。这两个条件对应redis zset集合key分别为:category_阿迪达斯、category_服装,如果希望是精准推荐其实就是对这两个集合求交集,即同时满足两个条件;如果希望是宽泛的列表推荐,对这两个集合求并集,即任意满足一个条件即可。这里假设业务方期望的是精准推荐,也就是求交集。

 

关于排序:业务方期望,最终的推荐结果是排序的:分值越高的活动越靠前,并且更新时间越近的越靠前。这是一个多条件的复合排序,使用rediszset实现复合排序很简单:zset的交集(zinterstore)和并集(zunionstore)运算结果中,会自动把两个集合的成员分值相加放到新的zset集合中,直接安装分值排序获取即可。我们认为很复杂的操作,其实在redis中一个命令就完成了,java伪代码实现如下:

 

public class RedisSearch {
    public static Jedis redis =null;
    public static void main(String[] args) throws Exception{
        redis = new Jedis("192.168.26.128", 6379);
 
        //创建倒排索引--分类集合
        redis.zadd("category_服装",8,"1000");
        redis.zadd("category_服装",9,"1001");
        redis.zadd("category_家电",7,"1002");
 
        //创建倒排索引--品牌集合
        redis.zadd("brand_阿迪达斯",8,"1000");
        redis.zadd("brand_阿迪达斯",9,"1001");
        redis.zadd("brand_海尔",7,"1002");
 
        //创建倒排索引--修改时间集合,只推荐近一周新出的活动页,定期删除老数据,这里只需取时间搓的后6位
        redis.zadd("update_time",639488,"1000");
        redis.zadd("update_time",639588,"1001");
        redis.zadd("update_time",639788,"1002");
 
        //执行交集查询,对category_服装、brand_阿迪达斯、update_time求交集即可
        redis.zinterstore("search_result","category_服装","brand_阿迪达斯","update_time");
 
        Set<Tuple> first = redis.zrangeWithScores("search_result",0,-1);
        Iterator iterator =first.iterator();
        while (iterator.hasNext()){
            Tuple temp = (Tuple)iterator.next();
            System.out.println("成员:"+temp.getElement()+"--"+"分值:"+temp.getScore());
        }
    }
}
 

 

执行main方法,打印信息为:

成员:1000--分值:639504.0
成员:1001--分值:639606.0

可以看到查询结果page_id分别为100010001,并且已经进行了复合排序(分值是三个集合分值的之和),根据分值默认排序展示即可。当然这里还有个步骤是根据page_idhash中获取页面信息(比如页面链接),这里可以通过pipeline批量获取,最后把页面信息列表返回给前端浏览器按顺序展示即可。

 

总结

 

创建搜索引擎的关键就是创建倒排索引分词,本次示例展示中没有进行分词,如果需要进行分词借助分词工具实现即可。另外使用rediszset进行复合排序也很简单,关键就是要定义好多个分值的权重比,直接求交集或并集 即可完成排序。

 

另外本次示例中没有使用同义词(求并集即可),其实都可以根据自己的需要添加进去。理论上通过redis可以实现一个完善的搜索引擎,在没有ES的情况下使用redis做一个简单的搜索引擎也是件很容易的事。

 

 

0
0
分享到:
评论

相关推荐

    一个使用scrapy和redis搭建的分布式爬虫搜索引擎

    一个使用scrapy和redis搭建的分布式爬虫搜索引擎

    基于vue+scrapy+elasticsearch+flask实现一个简易的搜索引擎

    说明 这个是自己用来练习的一个小项目 从头到尾实现一个简易的搜索引擎,搜索引擎里当然有很多核心的算法和技术,...搜索引擎部分使用当下很火的ElasticSearch,,之后会根据开源项目试着自己实现一个简易搜索引擎 设计

    ES的搜索引擎的设计与实现源码.zip

    本系统以SpringBoot基础框架整合其他技术设计和搭建而成,选用webmagic框架实现单节点的网络爬虫系统,爬虫的生命周期为链接提取、页面下载、内容抽取、持久化...最后实现一个简单的web搜索页面,来模拟搜索引擎客户端

    社区系统源码:基于 SpringBoot + MyBatis + MySQL + Redis + Kafka

    搜索引擎:Elasticsearch 6.4.3 安全:Spring Security 邮件任务:Spring Mail 分布式定时任务:Spring Quartz 日志:SLF4J(日志接口) + Logback(日志实现) 前端: Thymeleaf Bootstrap 4.x Jquery Ajax

    基于分布式爬虫的文章搜索引擎.zip

    随着大数据时代的到来,信息的获取与...然后选取ElasticSearch搭建搜索服务,同时提供了RESTful web接口;最后通过Django搭建可视化站点,供用户透明的对文章进行搜索。 关键词: 分布式爬虫; Scrapy; 搜索引擎; Redis

    一个基于分布式爬虫的信安文章搜索引擎

    爬虫的应用领域非常广泛,目前利用爬虫技术市面上已经存在了比较成熟的搜索引擎产品,如百度、谷歌,以及其他垂直领域搜索引擎,这些都是非直接目的;还有一些推荐引擎,如今日头条,可以定向给用户推荐相关新闻;...

    基于分布式爬虫的文章搜索引擎

    然后选取 ElasticSearch 搭建搜索服务,同时提供了 RESTful web 接口;最 后通过 Django 搭建可视化站点,供用户透明的对文章进行搜索。本项目可以更加透彻的理解爬虫的相关知识;在熟练运用 Python 语言的基础上,...

    Java 基于springboot高校表白墙社交系统

    Schedule 10 -solr搭建全文搜索引擎 Schedule 11 -单元测试与压力测试,项目部署等工作 Schedule 12 -产品功能扩展以及技术深度扩展 快速开始 在localhost:3306端口下启动mysql8,创建数据库whitewall,执行SQL表...

    好玩有趣-Java 高校表白墙社交系统(类似知乎、牛客网)

    Schedule 10 -solr搭建全文搜索引擎 Schedule 11 -单元测试与压力测试,项目部署等工作 Schedule 12 -产品功能扩展以及技术深度扩展 快速开始 在localhost:3306端口下启动mysql8,创建数据库whitewall,执行SQL表...

    毕业设计,基于SpringBoot+Bootstrap+MySql开发的综合博客系统,内含Java完整源代码,数据库脚本

    毕业设计,基于SpringBoot+Bootstrap+MySql开发的综合博客系统,内含Java完整源代码,数据库脚本 ...基于全文搜索引擎elasticsearch完成的文章搜索功能 6.持久层采用的ORM框架为mybatis,数据库为mysql

    毕业设计早餐外卖微信小程序课程设计源代码

    选用ElasticSearch作为分布式搜索引擎,早餐名(name字段)使用ik_max_word分词器 使用Netty+WebSocket实现聊天服务器,实现用户与店家的交流,并发送数据到mq,保存聊天消息和图片 使用Zookeeper作为分布式锁,保证库存...

    基于SSM+mysql的分布式电商项目源码+数据库+项目说明(课程设计).zip

    搜索功能使用SolrCloud做搜索引擎。 后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。 商城门户:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。 订单系统...

    爱旅行项目源码

    使用搜索引擎solr实现全文检索;使用Maven构建多模块项目;使用Nexus搭建Maven私服;使用Tengine+Lua+GraphicsMagick实现图片自动裁剪缩放;使用Nginx实现负载均衡的常用方式;使用Redis缓存技术在项目中的具体运用...

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    153 Solr 全文搜索引擎-Spring Boot 集成 Solr 154 Solr 全文搜索引擎-完成测试类 CRUD 功能 155 Solr 全文搜索引擎-实现搜索接口 156 Spring Boot 启用 Profile 157 Docker 私服搭建 158 项目的容器化部署1 159 ...

    爬虫源码(1).zip

    Python分布式爬虫打造搜索引擎 基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站 本教程一共八章:从零开始,直到搭建一个搜索引擎

    Java微服务架构163课

    153 Solr 全文搜索引擎-Spring Boot 集成 Solr 154 Solr 全文搜索引擎-完成测试类 CRUD 功能 155 Solr 全文搜索引擎-实现搜索接口 156 Spring Boot 启用 Profile 157 Docker 私服搭建 158 项目的容器化部署1 ...

    趁早(quickearly)B2C早餐外卖微信小程序

    选用ElasticSearch作为分布式搜索引擎,早餐名(name字段)使用ik_max_word分词器 使用Netty+WebSocket实现聊天服务器,实现用户与店家的交流,并发送数据到mq,保存聊天消息和图片 使用Zookeeper作为分布式锁,保证库存...

    142讲玩转【Spring Boot 分布式电商】开发

    该项目采用真实的开发需求来制作和讲解,主要技术点涵盖基于Freemarker技术,搜索引擎Solr技术,Maven技术,Nginx技术,使用Tengine+Lua+GraphicsMagick 实现图片自动裁剪,使用Redis+Token实现多端登录,使用Spring...

    分布式博客管理后端系统项目

    使用技术:SpringBoot + MyBatis + MySQL + MongoDB + Redis + Nginx + JWT 使用介绍:基于SpringBoot + Rpc-Netty-Framework前后端分离、控制与持久层分离的分布式博客系统。 项目亮点: 1. 使用Interceptor + JWT ...

    scrapy 分布式爬虫全集

    其中包括爬虫入门,虚拟环境搭建,对scrapy的调试,对动态网站的爬取,scrapy与mysql的使用,scrapy-redis分布式爬虫的使用, elasticsearch搜索引擎的使用, scrapyd部署scrapy爬虫。等相关内容

Global site tag (gtag.js) - Google Analytics