亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

sphinx全文檢索之PHP使用教程

系統(tǒng) 2119 0

Sphinx
以上一篇的email數(shù)據(jù)表為例:

數(shù)據(jù)結(jié)構(gòu):


01. CREATE TABLE email (
02. emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '郵件id' ,
03. ?
04. fromid int (10) unsigned NOT NULL default '0' COMMENT '發(fā)送人ID' ,
05. ?
06. toid int (10) unsigned NOT NULL default '0' COMMENT '收件人ID' ,
07. content text unsigned NOT NULL COMMENT '郵件內(nèi)容' ,
08. subject varchar (100) unsigned NOT NULL COMMENT '郵件標(biāo)題' ,
09. ?
10. sendtime int (10) NOT NULL COMMENT '發(fā)送時(shí)間' ,
11. ?
12. attachment varchar (100) NOT NULL COMMENT '附件ID,以逗號(hào)分割' , PRIMARY KEY (emailid),
13. ) ENGINE=MyISAM';




使用打開(kāi)控制臺(tái),必需打開(kāi)控制臺(tái)PHP才能連接到sphinx(確保你已經(jīng)建立好索引源):

d:\coreseek\bin\searchd -c d:\coreseek\bin\sphinx.conf



coreseek/api目錄下提供了PHP的接口文件 sphinxapi.php,這個(gè)文件包含一個(gè)SphinxClient的類

在PHP引入這個(gè)文件,new一下

01. $sphinx = new SphinxClient();
02. ?
03. //sphinx的主機(jī)名和端口
04. ?
05. $sphinx ->SetServer ( 'loclahost' , 9312 );
06. ?
07. //設(shè)置返回結(jié)果集為php數(shù)組格式
08. ?
09. $sphinx ->SetArrayResult ( true );
10. ?
11. //匹配結(jié)果的偏移量,參數(shù)的意義依次為:起始位置,返回結(jié)果條數(shù),最大匹配條數(shù)
12. ?
13. $sphinx ->SetLimits(0, 20, 1000);
14. ?
15. //最大搜索時(shí)間
16. ?
17. $sphinx ->SetMaxQueryTime(10);
18. ?
19. ?
20. ?
21. //執(zhí)行簡(jiǎn)單的搜索,這個(gè)搜索將會(huì)查詢所有字段的信息,要查詢指定的字段請(qǐng)繼續(xù)看下文
22. ?
23. $index = 'email' //索引源是配置文件中的 index 類,如果有多個(gè)索引源可使用,號(hào)隔開(kāi):'email,diary' 或者使用'*'號(hào)代表全部索引源
24. ?
25. $result = $sphinx ->query ( '搜索關(guān)鍵字' , $index );
26. ?
27. echo '
    
      ';



print_r($result);



echo '
    
  

';

$result是一個(gè)數(shù)組,其中

total是匹配到的數(shù)據(jù)總數(shù)量

matches是匹配的數(shù)據(jù),包含id,attrs這些信息

words是搜索關(guān)鍵字的分詞



你可能奇怪為什么沒(méi)有郵件的內(nèi)容這些信息,其實(shí)sphinx并不會(huì)返回像mysql那樣的數(shù)據(jù)數(shù)組,因?yàn)閟phinx本來(lái)就沒(méi)有記錄完整的數(shù)據(jù),只記錄被分詞后的數(shù)據(jù)。

具體還要看matches數(shù)組,matches中的ID就是指配置文件中sql_query SELECT語(yǔ)句中的第一個(gè)字段,我們配置文件中是這樣的

sql_query = SELECT emailid,fromid,toid,subject,content,sendtime,attachement FROM email

所以matches中的ID是指emailid

至于weight是指匹配的權(quán)重,一般權(quán)重越高被返回的優(yōu)先度也最高,匹配權(quán)重相關(guān)內(nèi)容請(qǐng)參考官方文檔

attrs是配置文件中sql_attr_ 中的信息,稍后會(huì)提到這些屬性的用法


說(shuō)了這么多,即使搜索到結(jié)果也不是我們想要的email數(shù)據(jù),但事實(shí)sphinx是不記錄真實(shí)數(shù)據(jù)的,所以要獲取到真實(shí)email數(shù)據(jù)還要根據(jù)matches中的ID去搜索mysql的email表,但總體來(lái)說(shuō)這樣一來(lái)一回的速度還是遠(yuǎn)遠(yuǎn)比mysql的LIKE快得多,前提是幾十萬(wàn)數(shù)據(jù)量以上,否則用sphinx只會(huì)更慢。



接下來(lái)介紹sphinx一些類似mysql條件的用法

01. //emailid的范圍
02. ?
03. $sphinx ->SetIdRange( $min , $max );
04. ?
05. ?
06. ?
07. //屬性過(guò)濾,可過(guò)濾的屬性必需在配置文件中設(shè)置sql_attr_??? ,之前我們定義了這些
08. ?
09. sql_attr_uint??????????? = fromid
10. ?
11. sql_attr_uint??????????? = toid
12. ?
13. sql_attr_timestamp? = sendtime
14. ?
15. //如果你想再次修改這些屬性,配置完成后記得重新建立索引才能生效
16. ?
17. ?
18. ?
19. //指定一些值
20. ?
21. $sphinx ->SetFilter( 'fromid' , array (1,2));??? //fromid的值只能是1或者2
22. ?
23. //和以上條件相反,可增加第三個(gè)參數(shù)
24. ?
25. $sphinx ->SetFilter( 'fromid' , array (1,2), false);??? //fromid的值不能是1或者2
26. ?
27. //指定一個(gè)值的范圍
28. ?
29. $sphinx ->SetFilterRange( 'toid' , 5, 200);??? //toid的值在5-200之間
30. ?
31. //和以上條件相反,可增加第三個(gè)參數(shù)
32. ?
33. $sphinx ->SetFilterRange( 'toid' , 5, 200, false);??? //toid的值在5-200以外
34. ?
35. ?
36. ?
37. //執(zhí)行搜索
38. ?
39. $result = $sphinx ->query( '關(guān)鍵字' , '*' );




排序模式
可使用如下模式對(duì)搜索結(jié)果排序:

SPH_SORT_RELEVANCE 模式, 按相關(guān)度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按屬性降序排列 (屬性值越大的越是排在前面)

SPH_SORT_ATTR_ASC 模式, 按屬性升序排列(屬性值越小的越是排在前面)

SPH_SORT_TIME_SEGMENTS 模式, 先按時(shí)間段(最近一小時(shí)/天/周/月)降序,再按相關(guān)度降序

SPH_SORT_EXTENDED 模式, 按一種類似SQL的方式將列組合起來(lái),升序或降序排列。

SPH_SORT_EXPR 模式,按某個(gè)算術(shù)表達(dá)式排序


01. //使用屬性排序
02. ?
03. //以fromid倒序排序,注意當(dāng)再次使用SetSortMode會(huì)覆蓋上一個(gè)排序
04. ?
05. $sphinx ->SetSortMode ( "SPH_SORT_ATTR_DESC" , 'fromid' );
06. ?
07. //如果要使用多個(gè)字段排序可使用SPH_SORT_EXTENDED模式
08. ?
09. //@id是sphinx內(nèi)置關(guān)鍵字,這里指emailid,至于為什么是emailid,自己思考一下
10. ?
11. $sphinx ->SetSortMode ( "SPH_SORT_ATTR_DESC" , 'fromid ASC, toid DESC, @id DESC' );
12. ?
13. //執(zhí)行搜索
14. ?
15. $result = $sphinx ->query( '關(guān)鍵字' , '*' );



//更多請(qǐng)查看官方文檔排序模式的說(shuō)明

匹配模式
有如下可選的匹配模式:

SPH_MATCH_ALL, 匹配所有查詢?cè)~(默認(rèn)模式);

SPH_MATCH_ANY, 匹配查詢?cè)~中的任意一個(gè);

SPH_MATCH_PHRASE, 將整個(gè)查詢看作一個(gè)詞組,要求按順序完整匹配;

SPH_MATCH_BOOLEAN, 將查詢看作一個(gè)布爾表達(dá)式

SPH_MATCH_EXTENDED, 將查詢看作一個(gè)CoreSeek/Sphinx內(nèi)部查詢語(yǔ)言的表達(dá)式 . 從版本Coreseek 3/Sphinx 0.9.9開(kāi)始, 這個(gè)選項(xiàng)被選項(xiàng)SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留這個(gè)選項(xiàng)是為了與遺留的舊代碼兼容——這樣即使Sphinx及其組件包括API升級(jí)的時(shí)候,舊的應(yīng)用程序代碼還能夠繼續(xù)工作。

SPH_MATCH_EXTENDED2, 使用第二版的“擴(kuò)展匹配模式”對(duì)查詢進(jìn)行匹配.

SPH_MATCH_FULLSCAN, 強(qiáng)制使用下文所述的“完整掃描”模式來(lái)對(duì)查詢進(jìn)行匹配。注意,在此模式下,所有的查詢?cè)~都被忽略,盡管過(guò)濾器、過(guò)濾器范圍以及分組仍然起作用,但任何文本匹配都不會(huì)發(fā)生.

我們要關(guān)注的主要是SPH_MATCH_EXTENDED2擴(kuò)展匹配模式,擴(kuò)展匹配模式允許使用一些像mysql的條件語(yǔ)句

01. //設(shè)置擴(kuò)展匹配模式
02. ?
03. $sphinx ->SetMatchMode ( "SPH_MATCH_EXTENDED2" );
04. ?
05. //查詢中使用條件語(yǔ)句,字段用@開(kāi)頭,搜索內(nèi)容包含測(cè)試,toid等于1的郵件:
06. ?
07. $result = $sphinx ->query( '@content (測(cè)試) & @toid =1' , '*' );
08. ?
09. //用括號(hào)和&(與)、|、(或者)、-(非,即!=)設(shè)置更復(fù)雜的條件
10. ?
11. $result = $sphinx ->query( '(@content (測(cè)試) & @subject =呃) | (@fromid -(100))' , '*' );
12. ?
13. //更多語(yǔ)法請(qǐng)查看官方文檔匹配模式的說(shuō)明



擴(kuò)展匹配模式中值得一提的是搜索的字段,如果該字段被設(shè)置屬性,那么擴(kuò)展匹配搜索的字段默認(rèn)是不包含這些屬性的,只能用SetFilter()或者SetFilterRange()之類

之前我們?cè)O(shè)置了fromid、toid、sendtime為屬性,但又想在擴(kuò)展匹配模式中又想用作條件該怎么辦?

只要在sql_query語(yǔ)句中再選擇多一次該字段就可以了

sql_query = SELECT emailid,fromid,fromid,toid,toid,subject,content,sendtime,sendtime,attachement FROM email

//設(shè)置完成記得重新建立索引

更多條件技巧
只是一些技巧,但不建議使用的部署環(huán)境中,至于為什么,請(qǐng)看文章結(jié)尾



<、<=、>、>=
默認(rèn)sphinx沒(méi)有這些比較符。

假如我想郵件的發(fā)送時(shí)間大于某一日期怎么辦?用SetFilterRange()方法模擬一下

01. //大于等于某一時(shí)間截$time
02. ?
03. $sphinx ->SetFilterRange( 'sendtime' , $time , 10000000000) //時(shí)間截最大是10個(gè)9,再加1是不可超越了。。
04. ?
05. ?
06. ?
07. //大于某一時(shí)間截$time
08. ?
09. $sphinx ->SetFilterRange( 'sendtime' , $time +1, 10000000000)
10. ?
11. //小于等于某一時(shí)間截$time
12. ?
13. $sphinx ->SetFilterRange( 'sendtime' , -1, $time )??? //時(shí)間截最小是0,所以應(yīng)該減1
14. ?
15. //大于某一時(shí)間截$time
16. ?
17. $sphinx ->SetFilterRange( 'sendtime' , -1, $time - 1)



IS NOT NULL
怎樣搜索為空的字段,比如我要搜索附件為空的郵件,有人可能會(huì)想 @attachment ('')不就可以了嗎?其實(shí)這是搜索兩個(gè)單引號(hào)。。。sphinx搜索的字符串不用加引號(hào)的

目前sphinx是沒(méi)有提供這樣的功能,其實(shí)可以在mysql語(yǔ)句上作手腳:

sql_query = SELECT emailid,fromid,toidsubject,content,sendtime,attachement != '' as attach is not null FROM email //這里返回了一個(gè)新字段attachisnotnull,當(dāng)attachisnotnull為1的時(shí)候附件就不為空了

//設(shè)置完成記得重新建立索引



FIND_IN_SET()
搜索包含某一附件的郵件,mysql習(xí)慣用FIND_IN_SET這么簡(jiǎn)單一句就搞定了,在sphinx中必需在配置里設(shè)置屬性sql_attr_multi 多值屬性(MVA):

sql_attr_multi = attachment #attachment可以是逗號(hào)分隔的附件ID,或者是空格、分號(hào)等sphinx都能識(shí)別

01. //設(shè)置完成記得重新建立索引
02. ?
03. ?
04. ?
05. 然后PHP中可以使用SetFilter()
06. ?
07. //搜索包含附件ID為1或2郵件,mysql語(yǔ)法是這樣FIND_IN_SET(`attachment`, '1,2')
08. ?
09. $sphinx ->SetFilter( 'attachment' , array (1,2))
10. ?
11. //可以使用SetFilterRange,搜索包含附件ID在50-100范圍的郵件
12. ?
13. $sphinx ->SetFilterRange( 'attachment' , 50, 100)


sphinx全文檢索之PHP使用教程


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: www.国产.com| 欧美激情在线观看一区二区三区 | 狠狠躁天天躁夜夜躁婷婷 | 福利姬在线精品观看 | 日韩区欧美区 | 久久国产乱子伦免费精品 | 中文字幕福利视频 | 一区二区三区在线观看视频 | 国产精品合集久久久久青苹果 | 涩涩的视频在线观看 | 日本一级毛片视频在线看 | 欧美亚洲一区二区三区四 | 免费观看成人www精品视频在线 | 午夜欧美性欧美 | 麻豆va一区二区三区久久浪 | 亚洲综合色dddd26 | 网络毛片 | 老子不卡影院 | 亚洲国产成人精品91久久久 | 色老头网站久久网 | 久久一精品 | 日韩欧美一级毛片精品6 | 国产精品嫩草研究所永久网址 | 欧美久久网 | 九色九色九色在线综合888 | 四虎视频国产精品免费入口 | 久久在线免费 | 欧做爰xxxⅹ性欧美大片孕妇 | 国产精品午夜激爽毛片 | 亚洲精品第一页中文字幕 | 免费高清成人啪啪网站 | 欧美成人在线免费观看 | 婷婷亚洲综合 | 99爱在线视频这里只有精品 | 婷婷激情在线视频 | 日本a毛片在线播放 | 日韩成a人片在线观看日本 日韩成人 | 天天爱夜夜爽 | 亚洲视频一二区 | 一级毛片美国一级j毛片不卡 | 国产成人在线免费观看 |