今天来给大家讲讲小程序的搜索功能。我这里后台数据库用的是小程序云开发的云数据库。所以我们搜索的时候就要借助云开发来实现。
一,需求
比如我这里有如下的一些数据
我们想实现如下搜索需求
- 1,搜索标题(title)包含‘小石头’的数据
- 2,搜索标题(title)或者描述(desc)包含‘小石头’的数据
- 3,搜索标题(title)描述(desc)都包含‘小石头’的数据
我们知道数据库查询的时候有个where语句,但是where语句是查询某个字段全部包含你输入的内容时才可以,所以单纯用where语句来做搜索的话,结果太单一。所以我们今天就来学习下模糊搜索功能的实现。我们以上面三个需求为例,来一个个讲解。
二,实现原理
我们做模糊搜索的时候,其实就是查询某个字段里是否包含我们的搜索词。而模糊搜索需要借助RegExp,来看看RegExp是什么。
官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Database.RegExp.html
- 再来看看官方示例
可能看官方示例会有点糊涂,那么我们接下来就结合具体代码来给大家做下讲解。
三,模糊搜索的代码实现
3-1,模糊搜索单个字段
- 需求:搜索标题(title)包含‘小石头’的数据
代码如下
查询结果如下:
可以看到我们成功的查询到了标题里包含‘小石头的数据’
3-2,模糊搜索多个字段(满足一个即可)
- 需求:搜索标题(title)或者描述(desc)包含‘小石头’的数据
由于我们要查询多个字段,所以我们这里用到了command高级操作符里的or
代码如下:
查询结果:
我们来分析下这两条数据
- 1,标题和描述都包含‘小石头’,符合
- 2,虽然标题里没有‘小石头’,但是描述里有,所以也符合。
- 3,title和desc里都没有‘小石头’,所以不符合。
3-3,模糊搜索多个字段(要同时满足)
- 需求:搜索标题(title)描述(desc)都包含‘小石头’的数据
由于我们要查询多个字段,所以我们这里用到了command高级操作符里的and
代码如下:
查询结果:
我们来分析下这两条数据
- 1,标题和描述都包含‘小石头’,符合
- 2,虽然desc里没有‘小石头’,但是title里没有,所以也不符合。
- 3,title和desc里都没有‘小石头’,所以也不符合。
四,源码
为例方便大家使用,我把完整的代码贴到这里,后面大家使用时,直接复制这里的代码,略微改造下就可以了。
//我这里简单起见就把搜索词写死,正常应该用户输入的
let searchKey = '小石头'
let db = wx.cloud.database()
let _ = db.command
db.collection('news')
.where(_.or([
{//标题
title: db.RegExp({ //使用正则查询,实现对搜索的模糊查询
regexp: searchKey,
options: 'i', //大小写不区分
}),
},
{//描述
desc: db.RegExp({
regexp: searchKey,
options: 'i',
}),
}
])).get()
.then(res => {
console.log('查询成功', res)
})
.catch(res => {
console.log('查询失败', res)
})
到这里就讲完了,我后面会专门在云开发入门的课程里作为实战案例录制视频给到大家的:
《小程序云开发入门视频》
提示:TypeError: _.or is not a function,是为啥?
提示:TypeError: _.or is not a function
您好,请问我要搜索二级关键词时应该如何修改呢?比如content本身也是个对象:"content":{"text": 111},我要查找text里包含搜索内容的数据。
谢谢您🌹
讲的非常好,谢谢你的教程
nice
清空检索词 匹配字段为空字符串'' 搜索全部数据
提示regexp must be a string 咋整?
云开发对于模糊搜索,多词、长文本匹配相似度排序有好的解决方案吗?(如中文分词等)
非常感谢
石头哥针不戳!