研究了coreseek下的sphinx 配置及api調(diào)用收獲頗多_第1頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、研究了coreseek下的sphinx 配置及api調(diào)用,收獲頗多。前言: 之前向來用法lucene,有無數(shù)優(yōu)點及缺點,最大的缺點就是要維護一個索引的成本很高,需要牽扯到無數(shù)方面,其中也包含業(yè)務(wù)方面;優(yōu)點呢,不用多說了,速度快,支持查詢的模式多,各種條件下的查詢都能實現(xiàn),所以想找一個越發(fā)符合現(xiàn)有應(yīng)用情況的搜尋引擎,故想到了coreseek=(sphinx 中文分詞 框架) sphinx 最大的益處是業(yè)務(wù)層面不需要你去關(guān)懷索引的建立、更新等,后臺定時去維護主索引和增量索引即可。同時有無數(shù)人性化的功能,比如防止建立索引時全表讀取造成數(shù)據(jù)庫掛掉,而舉行的分批讀取。增量索引方面可以讀取一段時光內(nèi)更新的

2、數(shù)據(jù),對于一個網(wǎng)站網(wǎng)站來說,更新的量占全部的數(shù)據(jù)的量比較小。增量索引適合短時光內(nèi)更新,主索引適合長時光內(nèi)更新。讀取索引的時候同時讀取這2個索引。 sphinxex引擎,這個個人覺得只適合終端查看些數(shù)據(jù),做調(diào)試相關(guān)的,線上用法還是得用他的api,支持n種語言了,今日測試的是java接口,感覺還不錯,不過也找到一些小缺點,少float類型的filter?。ㄓ胒loat_range也還可以), 少int類型的屬性,不明了sing類型的為啥沒寫出來。 和lucene比較除了上述的外,好的功能有:支持一對多的搜尋,sql_attr_mult 這個很有用,比如 我要找到公交車站叫a的旁邊的房子,一個房子對

3、應(yīng)著好幾個公交車站a,b,c,d等等的,很有用,杠杠的!呵呵。竟然還有地理坐標的查詢功能,正巧符合我們的業(yè)務(wù),查詢 房子周圍100米以內(nèi)的東西之類。 正文: 以下是實際用法的配置參數(shù)及功能,有寫的不對的還請指正。 1、官方和網(wǎng)上現(xiàn)有的增量索引方式都僅僅為自增的主鍵增強了多少,而并不包括之前的數(shù)據(jù)更新,按照這個情況,可以用法mysql里面的一個特別字段的功能:創(chuàng)建一個字段: last_upd_ timestamp not null default current_timestamp on update current_timestamp, 即只要該行有數(shù)據(jù)變更,這個字段的 即變成最新的時光,同時

4、增強記錄表,記錄主索引索引的最后時光。 create table sph_counter ( counter_ int(11) not null, max_doc_id int(11) not null, primary key (counter_id) ) engine=innodb default charset=utf8 collate=utf8_bin 然后呢,就是在sphinx配置文件里寫上相關(guān)的sql了。 source tasks type = mysql sql_host = 192.168.0.21 sql_user = root sql_pass = cjkjb110 sql

5、_db = design sql_port = 3306 sql_query_pre = set names utf8 sql_query_pre = set session query_cache_type=off sql_query_pre = replace into sph_counter select 1, unix_timestamp(max(last_updat_time) from tasks sql_query = select id,task_no as taskno,title,title as title1,reward,us,room,hall,wei,area,to

6、tal_budget as totalbudget,district,city,provie,unix_timestamp(created) as created_time,decoration_style_id,unix_timestamp(last_updated_time) as last_updated_time from tasks where last_updated_time = (select from_unixtime(max_doc_id) from sph_counter where counter_id=1) sql_attr_float = reward sql_at

7、tr_uint = status sql_attr_uint = room sql_attr_bigint = hall sql_attr_bigint = wei sql_attr_float = area sql_attr_float = totalbudget sql_attr_uint = district sql_attr_uint = city sql_attr_uint = province sql_attr_uint = created_time sql_attr_uint = last_updated_time sql_attr_bigint =taskno sql_attr

8、_string =title sql_attr_multi =uint decoration_style_id from field; sql_query_info_pre = set names utf8 行查詢時,設(shè)置正確的字符集 sql_query_info = select * from tasks where id=$id 指令行查詢時,從數(shù)據(jù)庫讀取原始數(shù)據(jù)信息 source tasks_delta : tasks sql_query_pre =set names utf8 sql_query = select id,task_no as taskno,title,title as

9、title1,reward,status,room,hall,wei,area,total_budget as totalbudget,district,city,province,unix_timestamp(created) as created_time,decoration_style_id,unix_timestamp(last_updated_time) as last_updated_time from tasks where last_updated_time (select from_unixtime(max_doc_id) from sph_counter where co

10、unter_id=1) 上面定義了主索引:tasks,增量索引tasks_delta 主索引里sql_query_pre 里插入了最新的last_update_time字段,執(zhí)行主索引的時候該語句就能執(zhí)行了,執(zhí)行增量索引的時候推斷的條件即是大于這個主索引的最后更新時光,這樣的話就能獵取到更新和添加的最新數(shù)據(jù)了。有一個缺點就是不能找到記錄刪除數(shù)據(jù),我們的解決辦法是用法規(guī)律刪除即增強一個is_delete字段來推斷是否是刪除。 2、搜尋1對多的狀況,打個比喻,數(shù)據(jù)庫中有n個文章的數(shù)據(jù),每個文章對應(yīng)有n個標簽,若是要求搜尋標簽得到m個文章的時候,一般的查詢就有困難了,之前的辦法也就是把多個標簽放在同

11、一個字段中,用逗號隔開之類,用法like查詢等,或者用法聯(lián)合查詢,沒有太好的解決計劃,sphinx里的sql_attr_multi字段就是為了解決這個問題而建。 上述表中的 sql_attr_multi =uint decoration_style_id from field; 該行就用法了這個辦法,詳細怎樣操作呢? decoration_style_id 字段是tasks表中的其中一個varchar列,里面記錄了例如12,45,2,89,323之類的數(shù)據(jù),其他什么都不需要配置挺直用法這一行代碼,就能給你自動按uint類型分成多行了,搜尋的時候挺直_filter(decoration_styl

12、e_id,89,fae) 就能搜尋出帶有89這個的記錄。功能十分有用,在無數(shù)方面都可以用的上,除了上面用的from field 還可以用法from query,from range_query等,這樣就可以聯(lián)合其他的表舉行索引查詢了。 3、精心的人可能發(fā)覺我寫的sql 中間加了無數(shù)別號,好多重復(fù)的字段,例如 title,title as title1 ,這樣的寫法是迎合sphinx的功能特點的,下面可以看到sql_attr_string =title 這句是定義一個屬性 attr,title1字段為field,attr 是在搜尋結(jié)果中可以顯示的,但是不能作為分詞舉行搜尋的,field 是可以作

13、為分詞舉行搜尋查詢的,兩者不能同時起作用,所以復(fù)制了一列,作不同的辦法用,這是我的方法,不知道有沒有更好的方法,有的話棘手告知我下感謝。 4、說下api,用法的是java ,常用的幾個語言辦法名和參數(shù)都類 ,貼上幾個主要的地方: sphinxclient cl =null; searchrelt t sr = null; sphinxresult res=null; int pagesize=6; int pageind=1; cl = new sphinxclient(); cl.setserver ( mons.constants.pubconstant.sphinxserver, 931

14、2 ); cl.setconnecttimeout(2000); cl.setmatchmode(sphinxclient.sph_match_all); if(chk(info.getarea() int a=integer.parseint(info.getarea(); float area_min=0.00f; float area_max=100000.00f; switch(a) case 1: area_min=0.00f; area_max=40.00f; break; case 2: area_min=41.00f; area_max=60.00f; break; case

15、3: area_min=61.00f; area_max=90.00f; break; case 4: area_min=91.00f; area_max=120.00f; break; case 5: area_min=121.00f; area_max=150.00f; break; case 6: area_min=151.00f; area_max=200.00f; break; default: break; cl.setfilterfloatrange( area , area_min, area_max, false); if(chk(info.getpagesize() pag

16、esize=integer.parseint(info.getpagesize(); if(chk(info.getpageindex() pageindex=integer.parseint(info.getpageindex(); cl.setlimits ( (pageindex-1)*pagesize, pagesize ); cl.setsortmode(sphinxclient.sph_sort_attr_desc, last_updated_time /根據(jù)字段排序 string q= if(info.getkeywords()!=null) q=info.getkeywords(); string index= * if(chk(info.gettypename() if(info.gettypename().equals(searchconstant.task) index= tasks,tasks_delta else if(info.gettypename().equals(searchconstant.case) index= cases,cases_delta res = cl.query(q,

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論