这是在开发搜索中台中涉及到的一些比较新颖的技术或者知识点或者设计思想,整合了一下思路和一些代码,方便日后的开发和复用

设计模式

设计模式就是一种设计思想,重点在于怎么设计而不是代码,项目中包含三个设计模式:门面模式,适配器模式,注册器模式。

门面模式

门面就是指一个统一的一个入口,也就是说前端只需要发送请求,不需要关心门面背后的具体细节。就好像用户去酒店订房间,酒店前台应该干的事情一样,比如用户需要同时定三个房间,这三个房间就直接让前台做好就行,不需要用户自己一间一间去完成。程序设计同理,假如前端需要三个方向的数据,比如同时请求了用户信息,文章信息和图片信息,可以抽象出一个接口,同时返回这三个信息,这样就不需要同时调用三个接口了。

适配器模式

适配器模式指定制统一的数据源接入规范,比如:

  1. 什么类型的数据源允许接入?
  2. 接入数据源时需要满足的要求?
  3. 接入时需要做出什么调整?

只要数据源符合了规范,那么它就可以被接入系统当中,假如原有的数据源已经做好了搜索等接口,但是和规范的数据源搜索接口不一致,有参数上的区别,那么通过适配器模式可以将两个接口对接成新的统一的接口,就好像转接插头那样。

注册器模式

注册器模式就是通过一个register注册表来方便后面要调用的对象,比如说用一个map来存,然后在接口中直接调用

Elastic stack技术栈

es分词

es分词是一个很有必要的技术,因为mysql自带的查询是包含查询,很不方便,比如说文章内容是:蔡徐坤是rapper ,而用户搜索输入了:蔡徐坤rapper 那么就搜不出来,但是这样的搜索正常来讲必须要搜出这篇文章,所以需要用到es和es分词器。分词器默认有空格分词器和内置分词器等等,但是我们不用这些,直接去GitHub上找ik_smart智能分词器,分词效果对中文也友好,测试效果如下:

打分机制

打分机制是说在搜索文章的时候,分数越高的文章会排在越前面,因此这个打分机制包括说搜索内容与文章贴合度越高分数就会越高(一般来说)。比如这里我搜索vue简介作为题目,他同时也搜索出了java简介,因为打分机制给java简介也打了分,可以看到是1.73分,而搜索内容中最高分是5.05分,因此5.05分会排在1.73分的java简介前面

这里就看出来搜索机制还是比较智能,起码可以把一些相关的都搜索出来

查询方式

es的查询方式包括在kibana的数据看板中创建可视化面板,也可以在dev tools中查询,比如:

GET post/_search
{
"query": {
"bool": { // 组合条件
"must": [ // 必须都满足
{ "match": { "title": "简介" }}, // match 模糊查询
{ "match": { "content": "vue" }}
],
"filter": [
{ "term": { "status": "published" }}, // term 精确查询
{ "range": { "publish_date": { "gte": "2015-01-01" }}} // range 范围查询
]
}
}
}

当然也支持高亮,但是我还没搞明白怎么在前端展示出来

GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "content": "测试" }}
]
}
},
"highlight": {
"fields": {
"content": {}
}
}
}

logstash

logstash是一个数据库同步脚本,它使用声明式编程,只需要自己写配置然后运行logstash,他就会帮你同步你的数据到不同的数据库中,比如



input {
jdbc {
jdbc_driver_library => "path\to\mysql-connector-java-version.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/db"
jdbc_user => "root"
jdbc_password => "*********"
parameters => { "favorite_artist" => "Beethoven" }

use_column_value => true
tracking_column => "updatetime"
tracking_column_type => "timestamp"
schedule => "*/5 * * * * *"
statement => "SELECT * from post where updateTime > :sql_last_value and updateTime < now() order by updateTime desc"
jdbc_default_timezone => "Asia/Shanghai"

}
}


output {
stdout { codec => rubydebug }
elasticsearch {
hosts => "127.0.0.1:9200"
index => "post"
document_id => "%{id}"
}

}

只要设定好input的数据库和output的数据库,将mysql-connector的jar包加入到目录下,再执行指令./logstash.bat -f ..\config\mytask.conf 即可开始同步。同时logstash还可作为定时脚本使用,监控input数据库的数据,如果发生更新,则定时同步到output数据库中

JMeter压力测试系统

首先新建线程组,设定好HTTP的测试的请求头和请求的地址和端口号:

最后就是新建一个请求启动就行:

image-20240923163953997

这里注意填好api地址和你需要过滤得到的数据,然后就可以查看结果了:

至此聚合报告中就可以看到压力测试的结果了。