電商網(wǎng)站上的搜索功能是如何實(shí)現的?     DATE: 2026-05-05 07:50:03

電商網(wǎng)站上的電商搜索功能(neng)是如何實(shí)現的?

學(xué)習計劃安排如下:

索引庫本質(zhì)上和數據庫類(lèi)似,也是網(wǎng)站存儲ヽ(′▽?zhuān)?ノ數據的,既然如此自然也會(huì )有增刪改查。上(shang)的搜索

那么這個(gè)索引庫到底有何ヽ(′▽?zhuān)?ノ特別應用(╯‵□′)╯呢?何實(shí)

索引庫的特別之處在于它ヽ(′ー`)ノ的查詢(xún),用戶(hù)搜索一個(gè)詞語(yǔ),電商響應哪些對應的網(wǎng)站數據給用戶(hù)?

重點(diǎn)是match匹配查詢(xún)和詞條查詢(xún)。

一、上的搜索索引庫的何實(shí)增刪改查

1新增數據

①通過(guò)POST請求添加數??據。

昨天我們給??索引庫設定了幾個(gè)字段,電商(′_`)以上述例子中的網(wǎng)站title字段為例,給其添加┐(′д`)┌一條數據“小愛(ài)手機”,上的搜索這樣后面可以通ヽ(′ー`)ノ過(guò)索引庫來(lái)快速定位這條數據了。??何實(shí)

通過(guò)響應結果可以看到result顯示的電商是“created”,也就是網(wǎng)站新建了一個(gè)數據。

注意:這里的上的搜索請求方式是POST,昨天關(guān)于索引庫的創(chuàng )建時(shí)POST對應的是修改,PUT是新增,至于這兒為何是POST,暫時(shí)不清楚。

②隨機生成id

系統會(huì )隨機生成一個(gè)id來(lái)記ヽ(′ー`)ノ錄這條新(xin)增的數據,但是這個(gè)id太復雜了,不好記住。

所以在新增數據時(shí)自定ヽ(′?`)ノ義id。

2、自定義id

在請求路徑中指定id即可。

關(guān)于請求路徑:索引庫??是liuxiaoai01,索引類(lèi)型goods,id為1,添加了一條數據。

有了id之后我們就可以去進(jìn)行修改和刪除數據的操作了,如果不是系統隨機的i??d不容易記住,使用起┐(′д`)┌來(lái)不方便。

3、修改數據??

PUT請求就是修改了,但是要注意使用PUT必須要指定id,如果沒(méi)有會(huì )報錯。

其中關(guān)于id的作用:

如果id在文檔中不存在,則新增該數據,就相當于通過(guò)POST添加了一條數據。

如果id??在文檔中存在,則修改對應id數據。

也通過(guò)PUT請求既能完成新增操作又能完成修改操作,一般都會(huì )直接使用PUT。

但也要知道使用POS??T新(xin)增數據這回事。

3、刪除數據

根據id即可刪除對應的數據。

PS???:觀(guān)察響應結果result的值就能看出來(lái)進(jìn)行了什么操作。

created對應新增數據。

u??pdate對應修改數據。??

delete對應刪除數據。

4、查詢(xún)數據

同樣的方式,GET請求即對應的查詢(xún)操作,根據id即可查詢(xún)出對應的數(shu)據。

但是這種方法基本不會(huì )用。

要知道用戶(hù)在搜索的時(shí)候,他怎么可能知道商品對應的idヽ(′ー`)ノ是多少?

所以用戶(hù)查詢(xún)的時(shí)候是使用不到id查詢(xún)的,就需要全文檢索技術(shù)了,

二、基本的搜索

1、匹配所有ヽ(′▽?zhuān)?ノ(match_all)

這里query代表的就(′_`)是??一個(gè)查詢(xún)對象,里面編寫(xiě)具體的查詢(xún)條件是怎樣的:

match_all即代表了匹配所有,也就對應了上圖中的例子。

match即匹配查詢(xún),怎么匹配可(ke)以自行說(shuō)明。

term即詞條查詢(xún),查ˉ\_(ツ)_/ˉ詢(xún)的時(shí)候ヽ(′▽?zhuān)?ノ不考慮分詞。

……除此之外,還有很多種查詢(xún)類(lèi)型。

其中查詢(xún)條件根據查詢(xún)類(lèi)型的不同會(huì )有多種不同的寫(xiě)法,后續遇到了就說(shuō)明。

現在主要講解下match匹配查詢(xún)和詞條查詢(xún)。

2、匹配查詢(xún)(match)

為了方便(°□°)測試,我向索引庫中添加了??兩條數據,現在索引庫中一共有4條數據:

“小愛(ài)手機”,“大愛(ài)手機”,“超??愛(ài)手機”以及“小愛(ài)電視”這4條。

match本身也就是??匹配的意思,現在匹配和“小愛(ài)電視(′?`)”相關(guān)的數據。

運行會(huì )發(fā)現“手機”相關(guān)(′?`)的數據都被搜索出來(lái)了,這是為什么呢?

因為“小愛(ài)電視”先會(huì )被分詞成“小”“愛(ài)”以及“電視”,和分詞相關(guān)的數據都會(huì )被( ?▽?)搜索出來(lái)。

其中(′?`*)響應的結(jie)果有個(gè)scor??e屬性,也就是得分的意思:score越高表示結(jie)果越(yue)匹配,

在電商網(wǎng)站上搜索某品牌手機,會(huì )發(fā)現:

該品牌其它產(chǎn)品也會(huì )被??搜索出來(lái)。

手(???)機殼啊什( ?° ?? ?°)么的也會(huì )被搜索出來(lái)。

就是這么一個(gè)道理。

and關(guān)系

operator翻譯過(guò)來(lái)是運算,意思就是將(jiang)分詞結果通過(guò)and連接起來(lái)。

查詢(xún)條件是“小愛(ài)電視”,但是其被(bei)分詞為了“小”,“愛(ài)”和“電視”,當然具體是不是這樣分詞我??不太清楚,但思路是一樣的(╯‵□′)╯:

如果不做說(shuō)明默認or連接,那么查詢(xún)到的數據的分詞只要滿(mǎn)足任意一個(gè)就ヾ(′?`)?可以。

如果說(shuō)明是and連接,那么查詢(xún)到的數據分詞必須要包含“小”,“愛(ài)”和“電視”。

3、詞條匹配(term)

我們在通過(guò)詞條匹配查詢(xún)“小愛(ài)電視”會(huì )發(fā)現結ヽ(′▽?zhuān)?ノ果竟然一條數據都沒(méi)有。

老實(shí)說(shuō)這個(gè)結果讓我很是懵逼,想了好久才明白,還不確定對不對,我大致說(shuō)下:

我們在創(chuàng )建索引庫的時(shí)候,title這個(gè)字段名類(lèi)型是text,它是會(huì )分詞的,并且分詞器是IK,這個(gè)昨天就詳細說(shuō)明過(guò)。

所以今天往索引庫中添加數據“小愛(ài)電視”,它會(huì )被分詞成“??小”、“愛(ài)”和“電視”。

索引庫中title這個(gè)字段是沒(méi)有“小愛(ài)電視”這個(gè)詞的,它被分詞了。

用match查詢(xún)時(shí)本身也會(huì )將查詢(xún)條件分詞,所以會(huì )被(bei)查詢(xún)到。

而用term查詢(xún)時(shí)不會(huì )將查詢(xún)條??件分詞,所以查詢(xún)不到。