---
# System prepended metadata

title: Ch7. Search-based applications
tags: [Redis]

---

---
tags: Redis
---

# Ch7. Search-based applications
## 7.1 Searching in Redis
* indexing
    * inverted indexing: 搜尋哪些文檔包含哪些字 -> 建立以字為key，文檔為value的set/zset
    * 一些常見的文字處理方法: tokenization、刪除停用詞
* searching
    * 基礎: ```sinter``` ```sinterstore```
    * 同義字: ```sunion``` ```sunionstore```
    * 排除關鍵字: ```sdiff``` ```sdiffstore```
* sorting: 搜尋結果排序
    * ```sort``` 
## 7.2 Sorted indexes
* 文章搜索，按照時間排的同時也要按照有用程度排
* 使用```zset``` ```zinterstore``` ```zunionstore```等
    * 取交集，並設置權重得到最後的排序
* 如果想用不是數字的方式sorted: 把文字先轉成數字

## 7.3 Ad targeting
* 廣告服務商需要找到最適合的廣告顯示給web使用者
* 可以利用7.1、7.2的內容設計這樣的服務
* 包含
    * 建立廣告的index: 
        1. 以location為key、以廣告包含的單字為key
        2. 紀錄廣告的平均點擊次數/動作執行次數(dict)
        3. 紀錄廣告的價值(基本價格與估計每千次價格eCPM)
        4. 記錄能搜到廣告的關鍵字
    * 根據使用者的location篩選廣告: 找eCPM最高的廣告
        1. match location: 找廣告 ```union```
        2. finish scoring: 計算符合的廣告的eCPM ```zintersetstore```、根據廣告與網頁的單字符合程度，決定eCPM要再加上多少 ```zunionstore```
        3. record targeting result: 選擇完廣告之後，紀錄結果
            1. 記錄每種廣告的展示次數 ```incr```
            2. 紀錄廣告及廣告單字的展示訊息(某個廣告被target到的次數、單字被用來計算eCPM附加值的總次數) ```zincrby```
            3. 廣告每展示每100次重新計算eCPM
    * 紀錄廣告被點擊的次數
        1. 紀錄次數 ```incr```
        2. 記錄廣告中含有的單字 ```zincrby```
    * 更新eCPM附加值
        1. 拿到廣告的類型、價格、包含的單字
        2. 拿到廣告的展示次數跟被點擊次數
        3. 計算eCPM並更新廣告價格
        4. 計算單字的eCPM，單字eCPM - 廣告eCPM = 單字附加值
## 7.4 Job search
* 另一個例子．搜尋用戶所擁有的技能和工作所需技能的匹配程度
* ```sadd```用戶所擁有的技能、```sadd```工作所需技能、```sdiff```兩者，如果都一樣，代表職位適合用戶
* 另一種思考方式
    * 建立以技能為index的set
    * zset:記錄每個工作所需的技能數
    * ```zunion```建立求職者的技能set
    * ```zinterset```：權重：對每個工作的得分＝-1、工作所需技能數目=1
    * 算出 = 0即為符合的工作