实现一个全站搜索功能的那些事

本篇文章干货满满,先收藏再观看,避免以后找不到了。闲话不多说,先看效果。

效果演示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

话题引入

没错,今天我们的话题主要是围绕,如何搭建一个搜全平台的搜索引擎来展开的。本篇会讲解后端和客户端的完整解决方案。需要一定的知识储备,不是通向幼儿园的车。新入行的准程序员也可以看看思路。先来解释一下什么是搜索引擎,有了数据库为什么还需要这么个玩意儿?搜索引擎会在一个项目的服务器架构演化的过程中被采用。搜索引擎的功能之一就是为了分压,当然这前面会优先采用其他技术达到这一目的。分走数据库的访问压力,一般首先会考虑应用层的方案。比如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": &
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dora丶Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值