redis技巧 自動完成功能實現

2021-09-08 11:43:10 字數 1873 閱讀 9876

自動完成功能一般都伴隨搜尋框出現,就是使用者在輸入時幫助其自動補全。

比如對成語進行補全,現有如下成語:一心一意,一心二用,一帆風順。

兩種實現方式:

實現方式一:

為每個成語的每個字首都使用乙個集合型別鍵來儲存該字首對應的成語名,並且為了實現排序,我們使用有序集合,並score都為0,這樣就按元素值的字典序排序。如果想要實現按照詞的熱度排序,需要再建立乙個有序集合,存放詞和score,最後把查詢結果和這個集合做交集即可,這樣可以避免更新乙個詞的熱度需要更新多個集合的情況,因為乙個詞會出現在多個集合中。

做法:對於上邊的成語就會建立如下形式的有序集合(key : value,...),score都為0:

一 :一心一意,一心二用,一帆風順

一心:一心一意,一心二用

一心一:一心一意

一心二:一心二用

一帆:一帆風順

一帆風:一帆風順

下邊實現生成這些字首對應的有序集合的**

$valuearr = ['一心一意','一心二用','一帆風順'];

//中文字元注意指定編碼,不能用$str[$i]方式獲取中文

foreach ($valuearr

as$item) }

在通過對應的關鍵字獲取對應的有序集合即可

$search1 = "一";

$search2 = "一帆";

$ret1 = $redis->zrange($$prefix.$search1, 0, -1);

$ret2 = $redis->zrange($$prefix.$search2, 0, -1);

如果需要實現熱度排序,只需要取關鍵字集合和全部成語的熱度集合的交集即可,通過引數指定兩個集合的分數組合方式

$redis->zinter($retzset, [$prefix.$search, $hotzset]); //

取交集$ret = $redis->zrevrange($retzset, 0, -1); //

倒序

實現方式二:

通過有序集合實現,該方法由redis作者介紹。因為有序集合當元素的score相同時,按照元素的字典序排序,利用這個特性只用乙個有序集合就能實現標籤補全。

做法:把全部成語字首存入有序集合,再把全部成語後邊加上*號後存入有序集合,分數均為0。

獲取時先取關鍵字在zset中的排名,然後在獲取排名後的n個元素,最後遍歷結果,找出*結尾並且以對應關鍵字開頭的元素即是結果。

先實現存入**

//

遍歷全部的字首和成語加入有序集合

foreach ($valuearr

as$item

)

$redis->zadd("auto:zset", 0, $member

); }

}

再實現獲取**

//

查詢$search = "一帆";

$rank = $redis->zrank("auto:zset", $search

);$ret = $redis->zrange("auto:zset", $rank + 1, $rank + 10); //

獲取10個

$ret = array_filter($ret, function($d

));echo "";print_r($ret);exit;

總結:

方式一需要n個集合儲存,但每個集合資料量較小,方式二只用乙個集合實現,但資料量大,同時實現熱度排序比較困難,這個看具體使用場景和資料量選擇吧。

自動完成功能

先放個吧!這是最終的效果!下面具體 index.php 把需要的js 庫包含進來 keywords here new capxous.autocomplete keyword function 這裡是具體呼叫的 auto.php header content type text html chars...

自動完成功能

先放個吧!這是最終的效果!下面具體 index.php 把需要的js 庫包含進來 keywords here new capxous.autocomplete keyword function 這裡是具體呼叫的 auto.php header content type text html chars...

自動完成功能 asp ajax

目錄頁 伺服器端 response.charset gb2312 gjz request.querystring gjz gjz replace gjz,str1 狐狸,白狐,銀狐,水貂,獺兔,貉子,白貉,烏蘇里貉,美國水貂,白兔,鳥,養殖,技術,魚,海魚,淡水魚 str2 split str1,s...