對(duì)于一個(gè)網(wǎng)站來(lái)說(shuō),無(wú)論是商城網(wǎng)站還是門戶網(wǎng)站,搜索框都是有一個(gè)比較重要的地位,它的存在可以說(shuō)是為了讓用戶更快、更方便的去找到自己想要的東西。對(duì)于經(jīng)常逛這個(gè)網(wǎng)站的用戶,當(dāng)然也會(huì)想知道在這里比較“火”的東西是什么,這個(gè)時(shí)候我們搜索框上的熱詞就起作用了。其實(shí)我覺得這一塊的完善會(huì)對(duì)這個(gè)網(wǎng)站帶來(lái)許多益處。
可能現(xiàn)在比較普遍的做法是把這些相應(yīng)的信息存到我們的關(guān)系型數(shù)據(jù)庫(kù)中,如sql server 和 oracle。方便起見的話,可能每搜索一次就往表里插一次數(shù)據(jù),用的時(shí)候要先統(tǒng)計(jì)數(shù)據(jù),統(tǒng)計(jì)完后再排序,最后才展示。這種情況下,如果搜索量很大的話,表的膨脹速度就會(huì)非常快,如果sql沒(méi)寫好,查詢的時(shí)候估計(jì)會(huì)。。相比Redis,同等條件下,Redis的速率肯定是會(huì)較優(yōu),畢竟是從內(nèi)存中拿出來(lái)的。
下面我們就用.NET Core和StackExchange.Redis來(lái)做一下這個(gè)簡(jiǎn)單的案例。
案例用到的一些相關(guān)技術(shù)和說(shuō)明:
開始正題之前,我們要確定用Redis中的那種數(shù)據(jù)結(jié)構(gòu),五種之中比較合適的應(yīng)該是SortedSet,我們可以用成員來(lái)作為搜索詞,成員分?jǐn)?shù)來(lái)作為搜索詞的搜索次數(shù),這樣就可以很方便的來(lái)操作相關(guān)的數(shù)據(jù)了。
下面開始正題:
我們?cè)陂_始的時(shí)候需要初始化一下數(shù)據(jù)。這里就直接在第一次運(yùn)行的時(shí)候初始化。用上流水線的技術(shù),速度還是很可觀的。初始化了70個(gè)搜索關(guān)鍵詞(NBA球星),然后用隨機(jī)數(shù)作為關(guān)鍵字的下標(biāo),去隨機(jī)給這個(gè)關(guān)鍵字加1分。這個(gè)分?jǐn)?shù)就是這個(gè)關(guān)鍵字被搜索的次數(shù)。下面來(lái)看看初始化的相關(guān)代碼:
publicIActionResultIndex(){//keysIList
這里是在加載這個(gè)頁(yè)面的時(shí)候就把這些熱搜詞存進(jìn)Redis中,這樣我們才能有數(shù)據(jù)來(lái)演示啊。這里還用到了一個(gè)非事務(wù)型的流水線。就是把要操作的指令存放到一個(gè)隊(duì)列中,最后把這個(gè)隊(duì)列扔到服務(wù)端去執(zhí)行,這樣就有效的減少了不必要的網(wǎng)絡(luò)傳輸,同時(shí)也提高了執(zhí)行速度。
好了,初始數(shù)據(jù)有了,下面要做的就是用戶在搜索的時(shí)候,根據(jù)用戶的輸入去匹配搜索次數(shù)多的關(guān)鍵字,展示最Hot的10個(gè),當(dāng)然這個(gè)展示的個(gè)數(shù)是隨我們定的,最后可以考慮把這個(gè)放到我們的配置文件中去,甚至是放到數(shù)據(jù)庫(kù)中,
為的是靈活和方便維護(hù)。下面是我們?cè)诤笈_(tái)的處理邏輯:
publicIActionResultGetHotKey(stringkey=""){if(string.IsNullOrEmpty(key)){//defaultvarres=_redis.ZRevRange(_searchKey,0,9);varlist=(fromiinresselecti.ToString());returnJson(list);}else{//byuserinputvarres=_redis.ZRevRange(_searchKey,0,-1);varlist=(fromiinresselecti.ToString()).Where(x=>x.Contains(key)).Take(10).ToList();returnJson(list);}}
對(duì)于查詢的處理是非常的簡(jiǎn)單的,用戶不小心輸入空格的時(shí)候就展示最熱的10個(gè)關(guān)鍵詞,如果用戶有輸入的話,就把關(guān)鍵詞中包含用戶輸入的展示出來(lái)。那么我們?cè)陧?yè)面上要做些什么呢?下面就是我們演示用的搜索框。
相應(yīng)的js是寫到 scripts 這個(gè)section中的,js的話是比較簡(jiǎn)單的就是用ajax去請(qǐng)求我們要展示的數(shù)據(jù)。更多的應(yīng)該是jquery-ui的api問(wèn)題,大家也可以換用自己比較熟悉的組件,舉一反三即可。下面是autocomplete的api,如果有需要可以去看一下。
@sectionscripts{}
到這里,用戶搜索前的操作,我們是做好了,下面先來(lái)看一下效果。
那么用戶點(diǎn)擊了搜索之后我們要做些什么處理呢?無(wú)論是新的關(guān)鍵字還是已有的關(guān)鍵字,我們都是要做處理的,當(dāng)然redis中zincrby命令來(lái)處理這個(gè)是十分合適的,存在的就把分?jǐn)?shù)加1,不存在就創(chuàng)建一個(gè)分?jǐn)?shù)為1的成員。下面是搜索時(shí)的后臺(tái)邏輯處理:
[HttpPost]publicIActionResultSetHotKey(stringkey){if(!string.IsNullOrWhiteSpace(key)){_redis.ZIncrby(_searchKey,key);//other//...returnJson(new{code="000",msg="OK"});}else{returnJson(new{code="999",msg="keywordcannotbeempty!"});}}
限制了用戶不能搜索空關(guān)鍵字,在把這個(gè)關(guān)鍵字存儲(chǔ)或者分?jǐn)?shù)加一之后,就是展示我們的搜索的結(jié)果。這個(gè)搜索的結(jié)果一般是從solr等全文檢索的地方查出來(lái)的,不是我們講的重點(diǎn),所以就忽略了。然后我們還要加一段js去處理我們搜索的時(shí)候應(yīng)該做的操作。當(dāng)然,都是些比較簡(jiǎn)單的操作。
//search$("#searchSubmit").click(function(){$.ajax({url:"@Url.Action("SetHotKey","Auto")",dataType:"json",type:"POST",data:{key:$("#key").val()},success:function(data){if(data.code=="000"){$("
searchsuccessful!
").appendTo("#result");}else{$(""+data.msg+"
").appendTo("#result");}}});});下面是效果圖:
在演示的時(shí)候,我們搜索了“我愛你”和“我不信”,在Redis的客戶端我們找出搜索次數(shù)最少的6個(gè),然后就可以看到我們那兩個(gè)關(guān)鍵字最的分?jǐn)?shù)都是1。確定是剛插入的數(shù)據(jù)。
到這里,我們做的這個(gè)熱搜詞可以說(shuō)是大功告成了。當(dāng)然這可以說(shuō)是最最最簡(jiǎn)單的一個(gè)雛形。我們還可以適當(dāng)?shù)奶砑右恍〇|西讓這個(gè)功能變得更加完善。比如我可以在搜索展示的時(shí)候顯示一下搜索的次數(shù)等。
最后是完整的控制器和頁(yè)面代碼:
usingAutoCompleteDemo.Common;usingMicrosoft.AspNetCore.Mvc;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;namespaceAutoCompleteDemo.Controllers{publicclassAutoController:Controller{privatereadonlyIRedis_redis;privatereadonlystring_searchKey="search";publicAutoController(IRedisredis){_redis=redis;}publicIActionResultIndex(){//keysIList
-
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40240 -
Redis
+關(guān)注
關(guān)注
0文章
379瀏覽量
10967
原文標(biāo)題:Redis 簡(jiǎn)單案例(一):網(wǎng)站搜索的熱搜詞
文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
[分享]最強(qiáng)山寨版搜索引擎震驚世界-熊熊搜索
?網(wǎng)站建設(shè) ?網(wǎng)站推廣 ?關(guān)鍵詞優(yōu)化 ?百度地標(biāo) ?歡迎...
關(guān)于電子發(fā)燒友論壇帖子搜索的問(wèn)題建議
labview中的搜索藍(lán)牙搜不到藍(lán)牙
離線語(yǔ)音Snowboy熱詞喚醒語(yǔ)音識(shí)別
如何使得redis中的數(shù)據(jù)不再有
如何清除劃詞搜索
中搜首推行業(yè)垂直搜索 專注電子商務(wù)信息
基于盲GDH簽名的無(wú)記憶模糊關(guān)鍵詞搜索
區(qū)塊鏈已經(jīng)超過(guò)了加密貨幣成為了最受歡迎的搜索熱詞
百度推無(wú)廣告“簡(jiǎn)單搜索”網(wǎng)頁(yè)版?官方回應(yīng):沒(méi)有 未來(lái)會(huì)考慮
![百度推無(wú)廣告“<b class='flag-5'>簡(jiǎn)單</b><b class='flag-5'>搜索</b>”網(wǎng)頁(yè)版?官方回應(yīng):沒(méi)有 未來(lái)會(huì)考慮](https://file1.elecfans.com//web2/M00/A7/56/wKgZomUMQ_mAMhInAAASOeoNWnE452.png)
評(píng)論