Sphinx在電子商務(wù)網(wǎng)站中的應(yīng)用_第1頁
Sphinx在電子商務(wù)網(wǎng)站中的應(yīng)用_第2頁
Sphinx在電子商務(wù)網(wǎng)站中的應(yīng)用_第3頁
Sphinx在電子商務(wù)網(wǎng)站中的應(yīng)用_第4頁
Sphinx在電子商務(wù)網(wǎng)站中的應(yīng)用_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一部分-分析與思路:實際項目的特點是:1.數(shù)據(jù)量大2.商品分類多3.每個商品可以處于多個分類下4.平均每個商品擁有2個以上的屬性要求可以做到:1.按照商品名稱搜索2.按照商品屬性篩選3.按照分類篩選4.按照價格分組篩選5.按照價格、時間排序mysql基本數(shù)據(jù)結(jié)構(gòu):說明:product是基本產(chǎn)品表,id為產(chǎn)品編號,name是待搜索字段product_index為產(chǎn)品屬性表,index_id是屬性編號,product_id為product表的id。如果編號為100的產(chǎn)品,有5個 不同屬性,在product_index表中就會記錄product_id為100,index_id不相同的五條記錄。pr

2、oduct_show的結(jié)構(gòu)與product_index類似,記錄的是產(chǎn)品于分類的聯(lián)系,如果同一個產(chǎn)品同屬5個不同的分類,在表中就會存在五條記錄。數(shù)據(jù)結(jié)構(gòu)不復(fù)雜,但是實際應(yīng)用中,使用mysql的查詢實現(xiàn)的搜索和檢索,效率是比較低的。最消耗性能的地方是產(chǎn)品列表的索引導(dǎo)航,這是類似淘寶網(wǎng)產(chǎn)品列表的”按xxx瀏覽”: sql的實現(xiàn)不多說。在sphinx有個非常棒的特性:mva(多值屬性),mva類似mysql的set類型的字段,但是存放值不受預(yù)設(shè)的限制,使用mva建立sphinx的屬性,用來存放每個產(chǎn)品的index_id和category_id,很方便就能實現(xiàn)篩選功能。第二部分-索引結(jié)構(gòu)配置:sphi

3、nx配置文件貼出主要部分,其他的手冊上說的很清楚了(手冊非常重要:上面是source部分,項目的編碼是utf-8,所以首先得執(zhí)行:“set names utf8”。product里面的price是以保留兩位小數(shù)的形式存放的,在sql_query里面,將它乘以100換成整數(shù),避免浮點精度帶來的不必要的小數(shù)位。關(guān)鍵的兩條“sql_attr_multi”,配置了屬性和分類的mva,“from query”后面緊接著sql,表示來自查詢,product_id放第一個字段,后面跟著值字段,這樣sphinx內(nèi)部才會進(jìn)行處理。建立索引后,結(jié)構(gòu)可以看成下圖所示:第三部分-查詢:sphinx自帶的php的api

4、進(jìn)行查詢。示例1:編號為1,2,3,4,5的5個分類下的產(chǎn)品列表:1. $sphinx->setfilter( category_id, array(1,2,3,4,5) );2. $sphinx->query( ”, *' );示例2:屬性編號為1,2,3,4,5的下的產(chǎn)品列表(屬性的交集)1. $sphinx->setfilter( index_id, array(1) );2. $sphinx->setfilter( index_id, array

5、(2) );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的下的產(chǎn)品列表(屬性的交集)的價格分組,并且升序排列1. $sphinx

6、->setfilter( index_id, array(1) );2. $sphinx->setfilter( index_id, array(2) );3. $sphinx->setfilter( index_id, array(3) );4. $sphinx->setfilter( index_id, array(4) );5. $sphinx->setfilter( index_id, array(5) );

7、6. $sphinx->setgroupby( price, sph_groupby_attr, group asc );7. $sphinx->query( ”, *' );示例4:屬性編號為1,2,3,4,5的下的產(chǎn)品列表(屬性的交集),分類編號是7,8,91. $sphinx->setfilter( category_id, array(7,8,9) );2. $sphinx->setfilter( index_id, array(1)&

8、#160;);3. $sphinx->setfilter( index_id, array(2) );4. $sphinx->setfilter( index_id, array(3) );5. $sphinx->setfilter( index_id, array(4) );6. $sphinx->setfilter( index_id, array(5) );7. $sphinx->setgroupby( price, s

9、ph_groupby_attr, group asc );8. $sphinx->query( ”, *' );sphinx的查詢使用還是很方便的,需要注意的是,filter傳遞的待篩選參數(shù)必須是數(shù)組;關(guān)于mva的使用,如果數(shù)組有多個成員:1. $sphinx->setfilter( category_id, array(7,8,9) );表示索引中的category_id滿足數(shù)組中的任意一個值就會篩選出來.1. $sphinx->setfilter( index_id,

10、0;array(7) );2. $sphinx->setfilter( index_id, array(8) );3. $sphinx->setfilter( index_id, array(9) );表示索引中的index_id包含7,8,9三個值才會被篩選出.mva也可以用來進(jìn)行g(shù)roup操作:$sphinx->setgroupby( index_value_id, sph_groupby_attr );可以很方便的得出當(dāng)前條件下的,各種屬性(樣式,品牌)的數(shù)量.第四部分-即時更新方案:使用了sphin

11、x代替了mysql進(jìn)行查詢后,最大的問題還在于數(shù)據(jù)的更新問題:我們在后臺進(jìn)行了產(chǎn)品的編輯,刪除,添加操作,都需要盡快的反應(yīng)到用戶端.架構(gòu)圖:說明:(1).在mysql中建立一個增量表,凡是產(chǎn)品更新操作(添加,修改,刪除),都會將相關(guān)id更新到到增量表;表結(jié)構(gòu)很簡單,只記錄id.(2).修改sphinx的配置文件1. sql_query = select id, name, price*100 as price, 0 as in_update from shop_product2. sql_attr_uin

12、t = in_update增加了一個字段in_update,用來標(biāo)記主索引的這條記錄,是否在增量表中.(3).產(chǎn)品的更新操作時,除了更新增量表,同時也利用sphinx api的updateattributes方法,將主索引中的相關(guān)記錄的in_update屬性設(shè)置成”11. $this->sphinx->updateattributes( $index, array( in_update ), array( $id => 1 ) );代碼中的$id指的是商品編

13、號.更新完了屬性后,發(fā)出增量索引更新通知,可以是寫隊列,寫文件等方式.(4).在查詢時,增加過濾器.1. $sphinx->setfilter( in_update, array(0) );這樣,就不會使用到主索引中的處于增量索引中的doc,以免搜索到錯誤的編輯前的數(shù)據(jù).(5).守護進(jìn)程接到增量索引更新通知,重建增量索引.(6).每天某時段更新主索引,清空增量表,清空增量索引思路就是這樣,下面的增量索引更新腳本是我用在測試環(huán)境的,生產(chǎn)環(huán)境的比較復(fù)雜,供參考.1. #!/bin/bash2. check_file_path=/xxx/sphinx-check.

14、txt3. sphinx_command=”/opt/sphinx/bin/indexer config /opt/sphinx/etc/product.conf product_update_index rotate”4. while true5. do6.  now_time=date +%y-%m-%d %h:%m:%s7.  if  -f $check_file_path then8.   word_num=cat $check_file_path |wc -w9.  

15、; if  $word_num -gt 0 then10.    echo ”bulid    $now_time”11.    $sphinx_command12.    > $check_file_path13.   else14.    echo ”skip    $now_time”15.   fi16.  else17.   echo ”nofile    $now_time”18.  fi19.  sleep 3020. done后臺操作時,簡單的用寫文件的方式通知索引更新腳本,索引更新完成后,將文件重置.第五部分-優(yōu)化總結(jié):這幾篇blog,沒想過寫成手把手的教程,只是想把思路寫出來,和大家交流

溫馨提示

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

評論

0/150

提交評論