一种基于热词和缓存的搜索引擎系统
技术领域
本发明涉及计算机技术领域,具体涉及一种基于热词和缓存的搜索引擎系统。
背景技术
传统的关系型数据库,比如mysql,oracle等,有很强大的数据存储能力,并且表与表之间可以通过主外键来建立表与表之间的关联关系。
虽然传统关系型数据库有很多优点,但是目前,对传统关系型数据库搜索数据时,依然存在很多缺点,不能满足当前很多业务场景的需求。
具体的说,传统关系型数据库搜索数据时,有以下几个缺点:
(1)需要全表扫描,字段里所有内容都要去like匹配,效率很低,搜索时间很慢;虽然可以在传统关系型数据库中可以为该字段创建索引,但是效果甚微。对于上亿条数据来说,使用like搜索效率就很低了。
(2)只能通过like 对文字进行模糊匹配搜索,但是like查询效率比较低,性能比较差,不能通过关键词搜索,比如想要搜索”引擎”,在sql语句中只能使用like ‘%引擎%’来搜索,如果使用like ‘%引8擎%’就搜索不到了;
(3)只能对单一列进行模糊搜索,无法进行全文检索;
更进一步地,如果在具体的业务系统上使用传统全文检索技术,在很多业务场景上依然不能适用:
(1)没有热点词汇,用户体验差。由于现在互联网网站,特别是电商系统 这种大规模数据级别的网站,服务器后台需要纵向统计所有用户的搜索关键词的频率,实时统计关键词的热度,并排序,这样就形成热点词汇了。
(2)没有搜索历史的缓存,不能满足业务需求。现在互联网网站,特别是电商系统,这种大规模数据级别的网站,服务器后台需要横向统计每个用户的搜索关键词的频率,在缓存中需要存储每个用户各自的搜索关键词的历史记录。
发明内容
本发明提出的一种基于热词和缓存的搜索引擎系统,可解决传统关系型数据库搜索数据时,效率低,用户体验较差的技术问题。
为实现上述目的,本发明采用了以下技术方案:
一种基于热词和缓存的搜索引擎系统,基于计算机设备设置以下模块:
自定义模型模块,用于搜索系统在请求和响应时使用;
控制层模块,用于负责拦截用户在浏览器前端发送的请求,接收用户在前台输入的搜索参数;
业务逻辑层模块,包括: 注册到dubbo中心的service接口,还包括service实现类;dubbo接口是对外提供的接口的,将来为其他分布式系统提供服务接口;service实现类是负责业务逻辑处理的,用于调用ElasticSearch搜索引擎的API接口,实现全文检索功能;
自定实体类对应的Repository接口模块,用于执行ElasticSearch搜索引擎的底层的API;
redis缓存模块,用于搜索关键词的横向统计,即搜索热词的排序,还有负责搜索关键词的纵向统计,即每个用户的搜索历史数据;
还包括Spring框架整合集成ElasticSearch搜索引擎的配置模块;
还包括在服务器安装ElasticSearch搜索引擎和同步中间件Logstach的安装和配置;
其中,上述模块实现以下步骤:
(1)预先使用同步中间件,将传统关系型数据库中的数据所针对的内容转存到搜索引擎中,生成索引文件;
(2)用户在业务系统的客户端浏览器网站上搜索关键词,向服务器发送搜索请求,该搜索请求包含用户输入的搜索关键词参数条件;
(3)服务器端接收到搜索关键词参数后,针对当前登录用户所搜索的关键词的历史,存储到缓存数据库中中,从而实现当前登录用户的搜索历史保存缓存的功能;
(4)服务器端接收到搜索关键词参数后,首先会在缓存中判断当前的搜索关键词有没有key值,如果有key值,就在搜索引擎中为该搜索关键词对应key值的score得分值加1,如果没有key值,那么在缓存中为这个第一次搜索的关键词创建key值,并为该key值对应的得分值赋值为1,从而实现业务系统的搜索关键词的纵向统计--热点词汇的排序;
(5)同时服务器端接收到搜索关键词参数后,在缓存中为当前登录用户保存搜索记录,下次用户再次登录之后,可展现搜素历史,从而实现业务系统的搜索关键词的横向统计即每个用户的搜索历史;
(6)在业务系统的框架中整合搜索引擎插件,服务器端接收到搜索关键词参数后,调用搜索引擎插件的API接口,实现了在搜索引擎的索引文件中进行全文检索;
(7)同步中间件实时监听同步数据,只要传统关系型数据库的数据有变化,同步中间件都会将传统关系型数据库中的数据所针对的内容转存到搜索引擎中,实时生成索引文件。
由上述技术方案可知,本发明设计了一种基于热词和缓存的搜索引擎系统,通过预先使用同步中间件,将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,生成索引文件。然后,在业务系统中,就可以使用本发明的搜索引擎的方法。
本发明的有益效果如下:
(1)预先使用同步中间件,将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,生成索引文件。
(2)本发明实现对每个用户搜索关键词的横向统计,实现每个用户的搜索历史记录: 服务器端接收到搜索关键词参数后,针对当前登录用户所搜索的关键词的历史,存储到缓存数据库中(比如redis),或者存储到cookie中,从而实现当前登录用户的搜索历史保存缓存的功能。保存搜索记录,下次用户再次登录之后,就可以展现搜素历史了,从而实现业务系统的搜索关键词的横向统计--每个用户的搜索历史
(3)本发明实现对所有用户搜索关键词的纵向统计,实现所有搜索关键词的热度排序:服务器端接收到搜索关键词参数后,首先会在缓存中判断当前的搜索关键词有没有key值,如果有key值,就在搜索引擎中为该搜索关键词对应key值的score得分值加1,如果没有key值,那么在缓存中为这个第一次搜索的关键词创建key值,并为该key值对应的得分值赋值为1,从而实现业务系统的搜索关键词的纵向统计--热点词汇的排序。
(4)在业务系统的框架中整合搜索引擎插件,服务器端接收到搜索关键词参数后,调用搜索引擎插件的API接口,实现了在搜索引擎的索引文件中进行全文检索,由于搜索引擎使用的是倒排索引,所以搜索性能很高,效率很高。
(5)同步中间件实时监听同步数据,只要传统关系型数据库的数据有变化(无论是增删改操作),同步中间件都会将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,实时生成索引文件。
本发明的基于热词和缓存的搜索引擎系统,能够大幅度提高搜索效率和搜索性能,并且实现全文检索技术的分布式,满足大多数业务场景,极致用户体验。
附图说明
图1是本发明的系统框图;
图2是本发明的工作原理图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。
如图1所示,本实施例所述的基于热词和缓存的搜索引擎系统,包括:
本发明设计了一种基于热词和缓存的搜索引擎系统,预先使用同步中间件,将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,生成索引文件。然后,在业务系统中,就可以使用本发明的搜索引擎的方法;
具体的说,如图1所示,本实施例的一种基于热词和缓存的搜索引擎系统,包括以下几个模块:
(1)自定义模型模块: 包括:自定义请求参数模型类,自定义响应数据类,自定义分页模型类,自定义实体类。作用是: 自定义模型方便搜索系统在请求和响应时使用。其中自定义实体类是ElasticSearch搜索引擎的实体,将来会在ElasticSearch搜索引擎创建一个Type类型,相当于在传统数据库中的一个table表。
(2)控制层模块: 即controller层,负责: 负责拦截用户在浏览器前端发送的请求,接收用户在前台输入的搜索参数等。将来扩展分布式系统时,这一层的功能有可能会被其他分布式系统的controller层所取代。
(3)业务逻辑层模块: 即service层,包括: 注册到dubbo中心的service接口,还包括service实现类。dubbo接口是对外提供的接口的,将来为其他分布式系统提供服务接口。service实现类是负责业务逻辑处理的,特别是调用ElasticSearch搜索引擎的API接口,实现全文检索功能。
(4)自定实体类对应的Repository接口模块: 用于执行ElasticSearch搜索引擎的底层的API。
(5)redis缓存模块: 负责: 搜索关键词的横向统计,即搜索热词的排序,还有负责搜索关键词的纵向统计,即每个用户的搜索历史数据。
(6)Spring框架整合集成ElasticSearch搜索引擎的配置模块:
(7)在服务器安装ElasticSearch搜索引擎和同步中间件Logstach的安装和配置: 在服务器中安装ElasticSearch搜索引擎,为本实施例的搜索引擎装置提供数据来源和倒排索引文件,还要安装 同步中间件Logstach,专门负责实时监控关系型数据库mysql 的数据变化,如果有变化,就会实现将mysql中的数据变化实时更新到 ElasticSearch搜索引擎的倒排索引文件中,这样ES的数据始终是最新数据。
本发明的基于热词和缓存的搜索引擎系统实现步骤如下:
(1)预先使用同步中间件,将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,生成索引文件。
(2)用户在业务系统的客户端浏览器网站上搜索关键词,向服务器发送搜索请求,该搜索请求包含用户输入的搜索关键词参数条件。
(3)服务器端接收到搜索关键词参数后,针对当前登录用户所搜索的关键词的历史,存储到缓存数据库中(比如redis)中,从而实现当前登录用户的搜索历史保存缓存的功能。
(4)并且服务器端接收到搜索关键词参数后,首先会在缓存中判断当前的搜索关键词有没有key值,如果有key值,就在搜索引擎中为该搜索关键词对应key值的score得分值加1,如果没有key值,那么在缓存中为这个第一次搜索的关键词创建key值,并为该key值对应的得分值赋值为1,从而实现业务系统的搜索关键词的纵向统计--热点词汇的排序。
(5)同时服务器端接收到搜索关键词参数后,就可以在缓存中为当前登录用户 保存搜索记录,下次用户再次登录之后,就可以展现搜素历史了,从而实现业务系统的搜索关键词的横向统计--每个用户的搜索历史。
(6)在业务系统的框架中整合搜索引擎插件,服务器端接收到搜索关键词参数后,调用搜索引擎插件的API接口,实现了在搜索引擎的索引文件中进行全文检索,由于搜索引擎使用的是倒排索引,所以搜索性能很高,效率很高。
(7)同步中间件实时监听同步数据,只要传统关系型数据库的数据有变化(无论是增删改操作),同步中间件都会将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中,实时生成索引文件。
如图2所示,本实施例的一种基于热词和缓存的搜索引擎系统的工作流程和工作原理如下:
(1)首先在服务器中安装ElasticSearch搜索引擎,为本实施例的搜索引擎装置提供数据来源和倒排索引文件,并提供ES搜索引擎的API底层方法调用。
(2)但是此时ES搜索引擎中没有倒排索引文件,就是没有数据,然后在服务器中安装同步中间件Logstach,在中间件Logstach中整合了ES搜索引擎和mysql数据库,在项目一开始部署时,将传统关系型数据库mysql的数据 全量转存到ES搜索引擎的索引文件中,那么保证项目一上线时就可以使用搜索引擎并且有倒排索引文件数据,防止了缓存雪崩的风险。
(3)当用户在客户端浏览器或者APP上输入产品关键词搜索,并选择搜索过滤条件,比如产品的材质,产品颜色,产品尺寸等,以及分页参数,以及正序排序,倒叙排序等参数,发送http请求,被controller控制层的拦截方法拦截,参数传到后台拦截程序,由自定义分页请求模型PageRequestModel接收获取参数,调用本实施例的搜索引擎装置的productSearchService 接口中的搜索方法来实现全文检索搜索的功能,更详细的,在调用本实施例的搜索引擎装置的productSearchService 接口的实现类中的搜索方法中使用ES引擎jar包中的BoolQueryBuilder。must(QueryBuilders。matchQuery(搜索条件参数名称,搜索条件参数值));
执行多次这行代码,添加多个搜索条件,最后调用ElasticsearchRepository底层的API,即执行productRepository。search(boolQueryBuilde或者productRepository。search(boolQueryBuilder,分页模型对象)可以搜索出想要的结果,实现全文检索。这里获取的是Iterable<Product>迭代器,然后可以使用google的jar包的Lists。newArrayList(迭代器对象)方法将迭代器对象转化成list集合即可。
(4)为了实现搜索关键词的横向统计,即每个用户自己的搜索关键词历史记录。本实施例的实现方案是: 当用户在客户端浏览器或者APP上输入产品关键词搜索,并选择搜索过滤条件,发送http请求,被controller控制层的拦截方法拦截,在后台请求方法中,搜索完成之后,将当前登录用户输入的搜索关键词,存到cookie中,再将cookie返回到response对象,这样就实现了每个用户自己的搜索关键词历史记录的统计,当然这个功能也可以使用redis缓存实现,在redis缓存中实现搜索关键词历史记录的统计,在此不再赘述。
(5)为了实现搜索关键词的纵向统计,即所有用户的搜索关键词的次数进行排名统计,得出搜索热词,本实施例的实现方案是: 当用户在客户端浏览器或者APP上输入产品关键词搜索,并选择搜索过滤条件,发送http请求,被controller控制层的拦截方法拦截,在后台请求方法中,搜索完成之后,调用本实施例的SearchHotSortService热词排序接口,然后调用SearchHotSortServiceImpl实现类中的方法,通过redis缓存模块实现搜索关键词score得分值的增减,从而实现搜索热词的统计排序。
综上所述,本发明实施例的一种基于热词和缓存的搜索引擎系统具备以下特点:
(1)预先使用同步中间件, 将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中, 生成索引文件。
(2)本发明实现对每个用户搜索关键词的横向统计, 实现每个用户的搜索历史记录: 服务器端接收到搜索关键词参数后, 针对当前登录用户所搜索的关键词的历史,存储到缓存数据库中(比如redis), 或者存储到cookie中, 从而实现当前登录用户的搜索历史保存缓存的功能。保存搜索记录, 下次用户再次登录之后, 就可以展现搜素历史了, 从而实现业务系统的搜索关键词的横向统计--每个用户的搜索历史
(3)本发明实现对所有用户搜索关键词的纵向统计, 实现所有搜索关键词的热度排序: 服务器端接收到搜索关键词参数后, 首先会在缓存中判断当前的搜索关键词有没有key值, 如果有key值, 就在搜索引擎中为该搜索关键词对应key值的score得分值加1,如果没有key值, 那么在缓存中为这个第一次搜索的关键词创建key值,并为该key值对应的得分值赋值为1, 从而实现业务系统的搜索关键词的纵向统计--热点词汇的排序。
(4)在业务系统的框架中整合搜索引擎插件, 服务器端接收到搜索关键词参数后, 调用搜索引擎插件的API接口, 实现了在搜索引擎的索引文件中进行全文检索,由于搜索引擎使用的是倒排索引, 所以搜索性能很高, 效率很高。
(5)同步中间件实时监听同步数据, 只要传统关系型数据库的数据有变化(无论是增删改操作), 同步中间件都会将传统关系型数据库中(如Mysql)的数据所针对的内容转存到搜索引擎中, 实时生成索引文件。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。