本篇文章干货满满,先收藏再观看,避免以后找不到了。闲话不多说,先看效果。
效果演示
话题引入
没错,今天我们的话题主要是围绕,如何搭建一个搜全平台的搜索引擎来展开的。本篇会讲解后端和客户端的完整解决方案。需要一定的知识储备,不是通向幼儿园的车。新入行的准程序员也可以看看思路。先来解释一下什么是搜索引擎,有了数据库为什么还需要这么个玩意儿?搜索引擎会在一个项目的服务器架构演化的过程中被采用。搜索引擎的功能之一就是为了分压,当然这前面会优先采用其他技术达到这一目的。分走数据库的访问压力,一般首先会考虑应用层的方案。比如Nginx反代的请求分发、熔断、降级等,这一部分是最基本的高并发保护措施。然后就是考虑Redis缓存,二八原则,因为大部分都是读的请求,小部分是写的请求。常用数据的访问就直接绕开数据库了,直接去读缓存就可以了。然后数据量不断增长后,海量数据的检索就会大幅消耗数据库连接池的性能,这个时候你不能老是熔断、降级,一直给用户返回服务器繁忙,请稍候重试,那用户还玩个锤子。这个时候搜索引擎就派上用场了,直接开搜索引擎集群了。
代码实现
Android端
搜索框的实现很简单,Android的基础知识。回车键功能改成搜索,只需要给EditText添加以下属性即可。
android:imeOptions="actionSearch"
点一下输入法的回车,也就是搜索按钮,执行以下代码调用搜索。
binding.etSearchInput.setOnEditorActionListener(TextView.OnEditorActionListener {
_, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// 隐藏键盘
(getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow(
currentFocus?.windowToken,
InputMethodManager.HIDE_NOT_ALWAYS
)
val keyword = ViewUtils.getText(binding.etSearchInput)
search(keyword)
return@OnEditorActionListener true
}
false
})
搜索一般来说服务端会给我们包装Solr的API,我们不会直接调用Solr的API,但考虑到直观,我还是决定给你们看一下Solr的搜索界面。
Retrofit的实现,最少传一个q的参数。
@GET("select")
fun select(@Query("q") q: String) : Call<SolrResult<DoraSearchResult>>
*:*
代表不添加搜索条件,搜索所有数据,但Solr默认给我们展示第一页的数据。这里冒号左边可以设置要搜索的属性,比如传参title:${keyword} description:${keyword}
,Solr会帮我们在title和description属性中匹配关键词,可以指定n多个属性。它的这个搜索不简简单单是对keyword整体的匹配。会先进行分词,再进行索引,这个我们放到后端讲。
服务端
Solr下载安装
下载地址:https://lucene.apache.org/solr
我这里也有旧版本sdk的备份。
wget https://dorachat-sdk.oss-cn-hongkong.aliyuncs.com/solr-8.11.3.tgz
解压
tar zxvf solr-8.11.3.tgz
修改SOLR_ULIMIT_CHECKS=false
vim solr.in.sh
启动Solr
./solr start -force
默认端口为8983
创建Solr核心
./solr create -c dorachat
查看Solr核心状态
./solr status
索引和搜索数据
步骤一:准备数据
在开始索引和搜索数据之前,你需要准备一些数据。
创建一个名为 data.json 的 JSON 文件,并填充一些示例数据:
{
"title": "剪映技巧教程",
"description": "第1集 认识剪映界面",
"content": "https://doravideo.oss-ap-southeast-7.aliyuncs.com/%E5%89%AA%E6%98%A0%E6%8A%80%E5%B7%A7%E6%95%99%E7%A8%8B/01.%E7%AC%AC1%E9%9B%86%20%E8%AE%A4%E8%AF%86%E5%89%AA%E6%98%A0%E7%95%8C%E9%9D%A2.mp4",
"category": "video",
"downloadPoints": "0"
},
{
"title": "剪映技巧教程",
"description": "第2集 调整素材时长",
"content": "https://doravideo.oss-ap-southeast-7.aliyuncs.com/%E5%89%AA%E6%98%A0%E6%8A%80%E5%B7%A7%E6%95%99%E7%A8%8B/02.%E7%AC%AC2%E9%9B%86%20%E8%B0%83%E6%95%B4%E7%B4%A0%E6%9D%90%E6%97%B6%E9%95%BF.mp4",
"category": "video",
"downloadPoints": &