搜索功能的技术方案

Posted ABKing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索功能的技术方案相关的知识,希望对你有一定的参考价值。

0X00 弃用canal

上一回说到,我在调研搜索功能的实现方案上选用了canal组件。然而,经过实际使用,发现存在比较大的问题

  1. 不支持全量同步
  2. 搭建起来比较复杂
  3. 长期不维护

这种同步数据的中间件叫做CDC。CDC是Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
于是在众多的CDC中选用组件肯定是没错的,于是我选用了著名的Apache Flink。顺带一提,我在小米时,内部大量使用了Flink,这也是促使我选用它的主要原因。

也许是在小米时培养的容器化思想,我也想将Flink-CDC进行容器化,以便于将它快速启动,快速迁移,而且解除它与ES和项目代码的耦合,也即它只做一件事——同步MySQL的数据到ES中。

0x0201

下载Apache Flink:https://flink.apache.org/downloads/
这里我使用的是V1.16.1:https://www.apache.org/dyn/closer.lua/flink/flink-1.16.1/flink-1.16.1-bin-scala_2.12.tgz

解压后在其中的lib目录增加flink-sql-connector-elasticsearch7-1.16.0.jar和flink-sql-connector-mysql-cdc-2.3.0.jar
下载地址为:
https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.3.0/flink-sql-connector-mysql-cdc-2.3.0.jar
https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-elasticsearch7/1.16.0/flink-sql-connector-elasticsearch7-1.16.0.jar
配置flink参考链接:https://ververica.github.io/flink-cdc-connectors/master/content/quickstart/mysql-postgres-tutorial.html

0x0203 制作Dockerfile

通过上述的镜像,制作Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/xxxx/base-common:flink-1.6.1
ENV JAVA_HOME /jdk1.8.0_371
ENV PATH $JAVA_HOME/bin:$PATH
WORKDIR /flink-1.16.1/bin
EXPOSE 8081
CMD ./start-cluster.sh && ./sql-client.sh -i init.sql -f job.sql && tail -f /dev/null

其中,init.sql的内容为:

SET execution.checkpointing.interval = 3s;

job.sql的内容为:

CREATE TABLE competition (
id INT,
title STRING,
status STRING,
content STRING,
coverUrl STRING,
startTime TIMESTAMP(0),
endTime TIMESTAMP(0),
PRIMARY KEY (id) NOT ENFORCED
   ) WITH (
\'connector\' = \'mysql-cdc\',
\'hostname\' = \'xxx.xxx.xxx\',
\'port\' = \'3306\',
\'server-time-zone\' = \'Asia/Shanghai\',
\'username\' = \'my_mysql_username\',
\'password\' = \'my_mysql_password\',
\'database-name\' = \'ideameeting\',
\'table-name\' = \'competition\'
   );

CREATE TABLE idm_competition (
     id INT,
     title STRING,
     status STRING,
     content STRING,
     coverUrl STRING,
     startTime TIMESTAMP(0),
     endTime TIMESTAMP(0),
    PRIMARY KEY (id) NOT ENFORCED
  ) WITH (
      \'connector\' = \'elasticsearch-7\',
      \'hosts\' = \'http://172.22.48.1:9200\',
      \'index\' = \'my_index\',
      \'username\' = \'my_es_username\',
      \'password\' = \'my_es_password\'
  );
insert into idm_competition select c.id, c.title, c.status, c.content, c.coverUrl,  c.startTime, c.endTime from competition as c;

使用以下命令编译成最终镜像
docker build -t flink-v1.16.1:v1 .
得到的这个镜像就可以随时启动,并且启动后开始同步MySQL的数据到ES中

0x03 给es添加用户名和密码

docker run -it -d -p 9200:9200 9300:9300 -e "discovery.type=single-node" elasticsearch:v7.16.1

进入容器后,修改config/elasticsearch.yml的内容,添加:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

然后执行./bin/elasticsearch-setup-passwords interaactive 设置密码

0x04 安装ik分词器

在准备就绪后,搜索时发现新的问题:搜索中文时,只支持搜索单个字符,不支持搜索词语。
这显然是分词器的问题,于是配置ik分词器
进入容器执行

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.1/elasticsearch-analysis-ik-7.16.1.zip

接下来,需要给索引需要搜索的字段添加mapping(无法给已存在的索引字段添加ik分词,因此需要删除原来的索引)
删除后,就可以添加配置ik分词了:

PUT http://xx.xx.xx.xx:9200/idm_competition
Content-Type: application/json


  "mappings": 
    "properties": 
      "title": 
        "type": "text",
        "analyzer": "ik_smart"
      ,
      "content": 
        "type": "text",
        "analyzer": "ik_max_word"
      
    
  

然后启动flink的镜像,数据就会同步到ES中了,并且title和content字段都会开启ik分词

Quick start Solr 之安装指南

 Solr简介

1. 企业站内搜索技术选型
在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能。
2. 使用solr的好处
基于 Solr 实现站内搜索扩展性较好并且可以减少程序员的工作量,因为 Solr 提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案。
3. 什么是 Solr
Solr 是 Apache 下的一个顶级开源项目,采用 Java 开发,它是基于 Lucene 的全文搜索服务器。 Solr 提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化
Solr 可以独立运行,运行在 Jetty、 Tomcat 等这些 Servlet 容器中, Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档, Solr根据 xml 文档添加、删除、更新索引 。 Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr返回 Xml、 json 等格式的查询结果进行解析,组织页面布局。 Solr 不提供构建 UI 的功能,Solr 提供了一个管理界面,通过管理界面可以查询 Solr 的配置和运行情况。solr 是基于 lucene 开发企业级搜索服务器,实际上就是封装了 lucene。Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接口。用户可以通过 http 请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果
Solr 类似 webservice,调用接口,实现增加,修改,删除,查询索引库。
4. Solr 与 Lucene 的区别
Lucene 是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene 提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以 Lucene 为基础构建全文检索引擎。Solr 的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过 Solr 可以非常快速的构建企业的搜索引擎,通过 Solr 也可以高效的完成站内搜索功能。Solr 类似 webservice,提供接口,调用接口,发送一些特点语句,实现增加,删除,修改。

Solr7.x 快速入门

从 Solr 官方网站(http://lucene.apache.org/solr/ )下载 Solr7.3.1

技术分享图片

点击DOWNLOAD下载

技术分享图片

最新版本下载

技术分享图片

技术分享图片

本文档只介绍Linux版本安装

安装Solr

导入solr安装包

a)  使用命令: rz命令

安装上传文件插件:yum -y install lrzsz

b)  使用工具导入: Xshell工具

技术分享图片

a)  创建solr目录

[[email protected] local]# mkdir solr

b)  移动solr安装包到solr目录下

[[email protected] local]# mv /home/ccsp/solr-7.3.1.tgz solr/

c)  解压安装包

[[email protected] solr]# tar -zxvf solr-7.3.1.tgz

d)  导入Tomcat8(注:solr7.x 必须用Tomcat8和jdk1.8以上版本,这里没有用solr自带的Jerry运行solr应用)

技术分享图片

a)  移动Tomcat8到solr服务,并解压

[[email protected] solr]# mv /home/ccsp/apache-tomcat-8.0.52.tar.gz .

[[email protected] solr]# tar -zxvf apache-tomcat-8.0.52.tar.gz

b)  更改Tomcat8名称以及端口号,并开放端口号

[[email protected] solr]# mv apache-tomcat-8.0.52 tomcat-solr

c)  拷贝solr到Tomcat服务器

拷贝solr解压包下面solr/server/solr-webapp/目录下的webapp文件夹,复制粘贴到Tomcat下的webapps下,并改名为solr

[[email protected] solr]# cp -r solr-7.3.1/server/solr-webapp/webapp/ tomcat-solr7/webapps/

drwxr-xr-x. 14 root root 4.0K 2018-06-11 11:08:15 docs

drwxr-xr-x.  6 root root  102 2018-06-11 11:08:15 examples

drwxr-xr-x.  5 root root 4.0K 2018-06-11 11:08:15 host-manager

drwxr-xr-x.  5 root root 4.0K 2018-06-11 11:08:15 manager

drwxr-xr-x.  3 root root 4.0K 2018-06-11 11:08:15 ROOT

drwxr-xr-x.  8 root root 4.0K 2018-06-11 11:31:52 webapp

[[email protected] webapps]# mv webapp solr

[[email protected] webapps]# ll

drwxr-xr-x. 14 root root 4.0K 2018-06-11 11:08:15 docs

drwxr-xr-x.  6 root root  102 2018-06-11 11:08:15 examples

drwxr-xr-x.  5 root root 4.0K 2018-06-11 11:08:15 host-manager

drwxr-xr-x.  5 root root 4.0K 2018-06-11 11:08:15 manager

drwxr-xr-x.  3 root root 4.0K 2018-06-11 11:08:15 ROOT

drwxr-xr-x.  8 root root 4.0K 2018-06-11 11:31:52 solr

d)  把solr-7.3.1serverlibext目录下的所有jar包、和solr-7.3.1dist下的solr-dataimporthandler-7.3.1.jar、solr-dataimporthandler-extras-7.3.1.jar粘贴复制到tomcat下的solr项目的WEB-INF/lib目录下

[[email protected] lib]# cp -r /usr/local/solr/solr-7.3.1/server/lib/ext/* .

技术分享图片

[[email protected] lib]# cp -r /usr/local/solr/solr-7.3.1/dist/solr-dataimporthandler-* .

技术分享图片

a)      把安装包下server目录下的solr文件夹粘贴复制到其他目录,然后重命名为: solrhome,这是solr核心文件夹

[[email protected] solr]# cp -r solr-7.3.1/server/solr .

[[email protected] solr]# ll

total 164M

-rw-rw-r--. 1 ccsp ccsp 9.0M 2018-06-11 11:05:18 apache-tomcat-8.0.52.tar.gz

drwxr-xr-x. 3 root root   89 2018-06-11 11:46:13 solr

drwxr-xr-x. 9 root root 4.0K 2018-06-11 11:01:45 solr-7.3.1

-rw-rw-r--. 1 ccsp ccsp 155M 2018-06-11 10:10:47 solr-7.3.1.tgz

drwxr-xr-x. 9 root root 4.0K 2018-06-11 11:08:15 tomcat-solr7

[[email protected] solr]# mv solr solrhome

b)     修改tomcat下的solr项目的WEB-INF/web.xml,这一步用来指定默认的solrhome。在web.xml开头附近找到:

技术分享图片

修改后为:

技术分享图片

m) 在tomcat下的solr项目的WEB-INF下新建classes目录,然后把solr- 7.3.1server esources下的log4j.properties粘贴过去
[[email protected] WEB-INF]# mkdir class
[[email protected] class]# cp -r /usr/local/solr/solr-7.3.1/server/resources/log4j.properties .

技术分享图片

a)      solr/server/lin下metrics开头的5个jar拷到tomcatwebappssolrWEB-INFlib下

[[email protected] lib]# cp -r /usr/local/solr/solr-7.3.1/server/lib/metrics-* .

技术分享图片

a)      去掉权限,tomcat  solr下的web.xml  注意最后一段话,注释下面这一段

技术分享图片

a)      启动Tomcat服务器,在浏览器输入http:ip:端口号/solr/index.html,回车出现如下界面即为成功

后台启动界面:

技术分享图片

前端页面展示:

技术分享图片

q) 点击logging查看日志没有报错说明启动正常

技术分享图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 












以上是关于搜索功能的技术方案的主要内容,如果未能解决你的问题,请参考以下文章

电商行业智能搜索技术原理全解析

Quick start Solr 之安装指南

Android开源实战:手把手带你实现一个简单好用的搜索框(含历史搜索记录)

CodeIgniter框架多条件搜索查询分页功能解决方案

Nattable:搜索和替换功能

部分增强Web技术