小程序搜索功能:雲開發搜索和(hé / huò)小程序雲開發模糊搜索,同時(shí)搜索多個(gè)字段 ...
發表時(shí)間:2021-2-20
發布人(rén):融晨科技
浏覽次數:90
今天來(lái)給大(dà)家講講小程序的(de)搜索功能。我這(zhè)裏後台數據庫用的(de)是(shì)小程序雲開發的(de)雲數據庫。所以(yǐ)我們搜索的(de)時(shí)候就(jiù)要(yào / yāo)借助雲開發來(lái)實現。
一,需求
比如我這(zhè)裏有如下的(de)一些數據
我們想實現如下搜索需求
- 1,搜索标題(title)包含‘小石頭’的(de)數據
- 2,搜索标題(title)或者描述(desc)包含‘小石頭’的(de)數據
- 3,搜索标題(title)描述(desc)都包含‘小石頭’的(de)數據
我們知道(dào)數據庫查詢的(de)時(shí)候有個(gè)where語句,但是(shì)where語句是(shì)查詢某個(gè)字段全部包含你輸入的(de)内容時(shí)才可以(yǐ),所以(yǐ)單純用where語句來(lái)做搜索的(de)話,結果太單一。所以(yǐ)我們今天就(jiù)來(lái)學習下模糊搜索功能的(de)實現。我們以(yǐ)上(shàng)面三個(gè)需求爲(wéi / wèi)例,來(lái)一個(gè)個(gè)講解。
二,實現原理
我們做模糊搜索的(de)時(shí)候,其實就(jiù)是(shì)查詢某個(gè)字段裏是(shì)否包含我們的(de)搜索詞。而(ér)模糊搜索需要(yào / yāo)借助RegExp,來(lái)看看RegExp是(shì)什麽。
- 再來(lái)看看官方示例
可能看官方示例會有點糊塗,那麽我們接下來(lái)就(jiù)結合具體代碼來(lái)給大(dà)家做下講解。
三,模糊搜索的(de)代碼實現
3-1,模糊搜索單個(gè)字段
- 需求:搜索标題(title)包含‘小石頭’的(de)數據
代碼如下
查詢結果如下:
可
以(yǐ)看到(dào)我們成功的(de)查詢到(dào)了(le/liǎo)标題裏包含‘小石頭的(de)數據’
3-2,模糊搜索多個(gè)字段(滿足一個(gè)即可)
- 需求:搜索标題(title)或者描述(desc)包含‘小石頭’的(de)數據
由于(yú)我們要(yào / yāo)查詢多個(gè)字段,所以(yǐ)我們這(zhè)裏用到(dào)了(le/liǎo)command高級操作符裏的(de)or
代碼如下:
查詢結果:
我們來(lái)分析下這(zhè)兩條數據
- 1,标題和(hé / huò)描述都包含‘小石頭’,符合
- 2,雖然标題裏沒有‘小石頭’,但是(shì)描述裏有,所以(yǐ)也(yě)符合。
- 3,title和(hé / huò)desc裏都沒有‘小石頭’,所以(yǐ)不(bù)符合。
3-3,模糊搜索多個(gè)字段(要(yào / yāo)同時(shí)滿足)
- 需求:搜索标題(title)描述(desc)都包含‘小石頭’的(de)數據
由于(yú)我們要(yào / yāo)查詢多個(gè)字段,所以(yǐ)我們這(zhè)裏用到(dào)了(le/liǎo)command高級操作符裏的(de)and
代碼如下:
查詢結果:
我們來(lái)分析下這(zhè)兩條數據
- 1,标題和(hé / huò)描述都包含‘小石頭’,符合
- 2,雖然desc裏沒有‘小石頭’,但是(shì)title裏沒有,所以(yǐ)也(yě)不(bù)符合。
- 3,title和(hé / huò)desc裏都沒有‘小石頭’,所以(yǐ)也(yě)不(bù)符合。
四,源碼
爲(wéi / wèi)例方便大(dà)家使用,我把完整的(de)代碼貼到(dào)這(zhè)裏,後面大(dà)家使用時(shí),直接複制這(zhè)裏的(de)代碼,略微改造下就(jiù)可以(yǐ)了(le/liǎo)。
//我這(zhè)裏簡單起見就(jiù)把搜索詞寫死,正常應該用戶輸入的(de)
let searchKey = '小石頭'
let db = wx.cloud.database()
let _ = db.command
db.collection('news')
.where(_.or([
{//标題
title: db.RegExp({ //使用正則查詢,實現對搜索的(de)模糊查詢
regexp: searchKey,
options: 'i', //大(dà)小寫不(bù)區分
}),
},
{//描述
desc: db.RegExp({
regexp: searchKey,
options: 'i',
}),
}
])).get()
.then(res => {
console.log('查詢成功', res)
})
.catch(res => {
console.log('查詢失敗', res)
})