Sphinx在電子商務網站中的應用_第1頁
Sphinx在電子商務網站中的應用_第2頁
Sphinx在電子商務網站中的應用_第3頁
Sphinx在電子商務網站中的應用_第4頁
Sphinx在電子商務網站中的應用_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第一部分-分析與思路:實際項目的特點是:1 .數據量大2 .商品分類多3 .每個商品可以處于多個分類下4 .平均每個商品擁有 2 個以上的屬性要求可以做到:1 .按照商品名稱搜索2 .按照商品屬性篩選3 .按照分類篩選4 .按照價格分組篩選5 .按照價格、時間排序MySQ 基本數據結構:product表idnamepriceproduct_indexindex_idproduct_idproductshowcategory_idproductid說明:product 是基本產品表,id 為產品編號,nam8!待搜索字段product_index 為產品屬性表,index_id 是屬性編號,pr

2、oduct_id 為 product表的 id。如果編號為 100 的產品,有 5 個不同屬性,在 product_index 表中就會記錄product_id 為 100,index_id 不相同的五條記錄。product_show 的結構與 product_index 類似,記錄的是產品于分類的聯系,如果同一個產品同屬 5 個不同的分類,在表中就會存在五條記錄。數據結構不復雜,但是實際應用中,使用 Mysql 的查詢實現的搜索和檢索,效率是比較低的。最消耗性能的地方是產品列表的索引導航,這是類似淘寶網產品列表的”按 XXX 瀏覽”:按圖案選擇:條跳4)格子1為40#圖案;5343)手繪(5

3、02)碎花眈)圓點尖幻其它圖案;71年技品牌詼擇:ONLY(7321:.淑女屋11紫5AbercrombieFtchr-7tGchirly牌時力090)韓國$二三。$Burberry,巴寶利叮知SQL 的實現不多說在 Sphinx 有個非常棒的特性: MVA 侈值屬性) , MVAfe 似 Mysql 的 set 類型的字段,但是存放值不受預設的限制,使用 MVAS 立 Sphinx 的屬性,用來存放每個產品的index_id 和 category_id,很方便就能實現篩選功能。第二部分-索引結構配置:Sphinx 配置文件貼出主要部分,其他的手冊上說的很清楚了(手冊非常重要:http:/ww

4、w.wapm.Cn/uploads/pdf/sphinxdoczhcn0.9.pdf)。sourceproductsrctype二mysqlsql_host5ql_usersql_passsql_dbsql_port==root=123=shop-3306sql_qu已rsqlqueryshop_produci:=SETMAMESutf8=SELECTidjnarwjprice*lWASpriceFROMsql_attr_uintsql_attrmultiidFROMproductindexEql_attr_nnilticategory_idFROMproduct_show-

5、price-uintindex_idfrotaquery;SELECTprodutji*index=uintcategory_idranquery;SELECTproduct_idt上面是 source 部分, 項目的編碼是 UTF-8,所以首先得執行: “SETNAMEStf8”。 product里面的 price 是以保留兩位小數的形式存放的,在 sql_query 里面,將它乘以 100 換成整數,避免浮點精度帶來的不必要的小數位。關鍵的兩條“sql_attr_multi,配置了屬性和分類的 MVA“fromquery”后面緊接著 SQL京示房自查詢,product_id 放第一個字段,

6、后面跟著值字段,這樣 Sphinx 內部才會進行處理。建立索引后,結構可以看成下圖所示:product第三部分-查詢:Sphinx 自帶的 PHP 勺 API 進行查詢。示例 1:編號為 1,2,3,4,5 的 5 個分類下的產品列表:1. $Sphinx-SetFilter(category_id,array(1,2,3,4,5);2. $Sphinx-Query(,夫);示例 2:屬性編號為 1,2,3,4,5 的下的產品列表(屬性的交集)1. $Sphinx-SetFilter(index_id,array(1);2. $Sphinx-SetFilter(index_id,array(2

7、);3. $Sphinx-SetFilter(index_id,array(3);4. $Sphinx-SetFilter(index_id,array(4);5. $Sphinx-SetFilter(index_id,array(5);6. $Sphinx-Query(,*);示例 3:屬性編號為 1,2,3,4,5 的下的產品列表(屬性的交集)的價格分組,并且升序排列1.$Sphinx-SetFilter(index_id,array(1);2.$Sphinx-SetFilter(index_id,array(2);3.$Sphinx-SetFilter(index_id,array(3)

8、;4.$Sphinx-SetFilter(index_id,array(4);5.$Sphinx-SetFilter(index_id,array(5);categoryid(123,45,Jindexid1100.200300,-16. $Sphinx-SetGroupBy(price,SPH_GROUPBY_ATTR,groupasc);7. $Sphinx-Query(,*);示例 4:屬性編號為 1,2,3,4,5 的下的產品列表(屬性的交集),分類編號是 7,8,9category_id,array(7,8,9);index_id,array(1);index_id,array(2)

9、;index_id,array(3);index_id,array(4);index_id,array(5);price,SPH_GROUPBY_ATTR,groupSphinx 的查詢使用還是很方便的,需要注意的是,Filter 傳遞的待篩選參數必須是數組;關于 MVA 勺使用,如果數組有多個成員category_id,array(7,8,9);表示索引中的 index_id 包含 7,8,9 三個值才會被篩選出MVA4 可以用來進行 Group 操作:$Sphinx-SetGroupBy(index_value_id,SPH_GROUPBY_ATTR);可以很方便的得出當前條件下的,各種屬

10、性(樣式,品牌,)的數量.第四部分-即時更新方案:使用了 Sphinx 代替了 Mysql 進行查詢后,最大的問題還在于數據的更新問題:我們在后臺進行了產品的編輯,刪除,添加操作,都需要盡快的反應到用戶端.架構圖:..$Sphinx-SetFilter($Sphinx-SetFilter($Sphinx-SetFilter($Sphinx-SetFilter($Sphinx-SetFilter($Sphinx-SetFilter($Sphinx-SetGroupBy(asc);$Sphinx-Query(,1.$Sphinx-SetFilter(表示索引中的 cat

11、egory_id滿足數組中的任意一個值就會篩選出來.1. $Sphinx-SetFilter(2. $Sphinx-SetFilter(3. $Sphinx-SetFilter(index_id,array(7);index_id,array(8);index_id,array(9);說明:(1) .在 Mysql 中建立一個增量表,凡是產品更新操作(添加,修改,刪除),都會將相關ID 更新到到增量表;表結構很簡單,只記錄 ID.(2) .修改 Sphinx 的配置文件1. sql_query=SELECTid,name,price*100ASprice,0ASin_updateFROMsho

12、p_product2. sql_attr_uint=in_update增加了一個字段 in_update,用來標記主索引的這條記錄,是否在增量表中.(3) .產品的更新操作時,除了更新增量表,同時也利用 SphinxAPI 的UpdateAttributes 方法,將主索引中的相關記錄的 in_update 屬性設置成”11. $this-Sphinx-UpdateAttributes($index,array(in_update),array($id=1);代碼中的$id 指的是冏品編號.更新完了屬性后,發出增量索引更新通知,可以是寫隊列,寫文件等方式.(4) .在查詢時,增加過濾器.1.

13、$Sphinx-SetFilter(in_update,array(0);這樣,就不會使用到主索引中的處于增量索引中的 doc,以免搜索到錯誤的編輯前的數據.(5) .守護進程接到增量索引更新通知,重建增量索引.(6) .每天某時段更新主索引,清空增量表,清空增量索引,思路就是這樣, 下面的增量索引更新腳本是我用在測試環境的, 生產環境的比較復雜,供參考.1. #!/bin/bash2. CHECK_FILE_PATH=xxx/sphinx-check.txt3. SPHINX_COMMANDOpt/sphinx/bin/indexer-config/opt/sphinx/etc/produc

14、t.confproduct_update_index-rotate”4. whiletrue5. do6. NOW_TIME=date+%Y%m%d%H:%M:%S7. if-f$CHECK_FILE_PATH;then8. WORD_NUM=cat$CHECK_FILE_PATH|wc-w9. if$WORD_NUM-gt0;then10. echo”bulid$NOW_TIME11. $SPHINX_COMMAND12. $CHECK_FILE_PATH13. else14. echoskip$NOW_TIME15. fi16. else17. echo”nofile$NOW_TIME18. fi19. sleep3020. done后臺操作時,簡單的用寫文件的方式通知索引更新腳本,索引更新完成后,將文件重置.第五部分-優化總結:這幾篇 blog,沒想過寫成手把手的教程,只是想把思路寫出來,和大家交流,所以流水賬了,代碼都是些關鍵片段,不負責它正常運行!基礎方面的請到 Sphi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論