需求描述
mysql中,每乙個文件都有多個標籤,查詢時可以篩選乙個標籤也可以篩選同時擁有多個標籤的文件。
資料示例
文件 標籤
1 1,2,3,4,5
2 2,3,4,5,6
3 3,4,5,6,7
4 4,5,6,7,8
5 5,6,7,8,9
注意:
這裡將文件id和標籤tagid的對應關係存入了fy_content_tag表,乙個id對應多條tagid記錄
查詢要求
1、查出擁有標籤2的文件
2、查出同時擁有標籤2,3,4的文件
使用sphinx解決需求
1、配置shpinx mva多值屬性
編輯sphinx配置檔案,給資料來源增加乙個多值屬性
sql_attr_multi = uint tagid from query;\
select id,tagid from fy_content_tag
2、執行查詢
使用api中的setfilter即可。
1、查出擁有標籤2的文件
$sphinx->setfilter('tagid', array(2));
2、查出同時擁有標籤2,3,4的文件
$sphinx->setfilter('tagid', array(2));
$sphinx->setfilter('tagid', array(3));
$sphinx->setfilter('tagid', array(4));
這裡解釋一下:
$sphinx->setfilter(『tagid』, array(2,3,4));
是表示含有標籤值2,3,4中的任意乙個即符合篩選,這裡是or關係。
$sphinx->setfilter(『tagid』, array(2));
$sphinx->setfilter(『tagid』, array(3));
$sphinx->setfilter(『tagid』, array(4));
設定三個filter是標示,要同時滿足2,3,4三個屬性值才符合,這裡是and關係。
sphinx sql_attr_multi配置參考
在sphinx中,有乙個mva屬性,宣告格式如下(用反斜線只是為了清晰,您仍可以在一行之內完成宣告):
sql_attr_multi = attr-type attr-name 『from』 source-type \
[;query] \
[;range-query]
其中attr-type 是 『uint』 或 『timestamp』之一
source-type 是 『field』, 『query』, 或 『ranged-query』之一
query 是用來取得全部(文件 id,屬性值)序對的 sql 查詢
range-query 是用來取得文件 id 的最小值與最大值的 sql 查詢,
與』sql_query_range』類似
示例:sql_attr_multi = uint tag from field;
sql_attr_multi = uint tag from query; select id, tag from tags
sql_attr_multi = uint tag from ranged-query; \
select id, tag from tags where id>=$start and id<=$end; \
select min(id), max(id) from tags
使用field型別時,field欄位的值應該是以英文逗號隔開的多個無符號32位整數,如:1,2,3,4
使用query或者ranged-query時,每行乙個值,乙個id對應多個(多行)tag值
上面講的都是一些理論,實際工作中我們不需要再建立一張表,而是增加乙個欄位就可以了:
sphinx mva(宣告多值屬性)的用法最近開始學習sphinx,於是安裝了「coreseek 全文檢索伺服器
2.0「,詳情可訪問coreseek官網,喬老大真的很熱心,有問題可以post在bbs,也可以加他的msn,他都會耐心的為你解答,真是難得的好人。
回到主題,在mysql資料庫中,有set(集合)型別,可以儲存多個值,使用find_in_set函式查詢也很方便。在使用sphinx中,有乙個mva屬性,宣告格式如下(用反斜線只是為了清晰,您仍可以在一行之內完成宣告):
sql_attr_multi = attr-type attr-name '
from
' source-type \
[;query] \
[;range-query]
其中attr-type 是 『uint
』 或 『timestamp』之一
source-type 是 『field』, 『query』, 或 『ranged-query』之一
query 是用來取得全部(文件 id,屬性值)序對的 sql 查詢
range-query 是用來取得文件 id 的最小值與最大值的 sql 查詢,
與』sql_query_range』類似
示例:sql_attr_multi = uint tag from
field;
sql_attr_multi = uint tag from
query; select id, tag from tags
sql_attr_multi = uint tag from ranged-query; \
select id, tag from tags where id>=$start and id<=$end; \
select min(id), max(id) from tags
使用第一種還是比較方便,由於沒有說明,當時也試了很久,字段值的存放格式是:
| tag |
|1,2,3,4,5,6|使用field型別,就可以實現了。這裡的分隔符不僅僅可以使用逗號,還可以使用空格,或者其他字元,如:
| tag |
|1%3%14
60|sphix也是可以識別的,不過,還是統一用分隔符比較好。^-^
如何在sphinxse中使用?
在sphinxse中用where query='filter=ids,2345,5334
' 即可實現sql中where ids in (2345,5334)的效果。
修改sphinx最大輸出記錄數
歸納如下:sphinx的查詢預設最大記錄數是:
1000
,而我們想更改這個數值。就需要更改三個地方。
1是更改sphinx.conf配置檔案的:max_matches = 10000 #後面數字就是你想查詢的最大記錄數。建議在1000~10000之內。
2是在api呼叫時,$cl->setlimits($pagestart, $pagesize, $max_limits);用setlimits的第三個引數更改為你想要的顯示最大記錄數。
3修改sphinxclient.php 中max_matches
問題是這樣的,資訊列表頁的分頁裡顯示有100多頁,但到51頁的時候不顯示正確的資訊列表了。按慣例,輸出結果,檢視可疑之處。發現返回的結果裡total永遠都是1000,total_found大概是分頁中顯示的頁數和每頁資訊數的乘積,這說明total_found返回的是真正的資訊數,但查詢結果的時候又受到了total的限制。
1000
)這個東東,原來max_matches在這兒被定成了1000。
據說max_matches設定太大的話,查詢速度會受影響,想了想把這個值設成變數,等於要查詢的頁數和每頁資訊數的乘積,這樣就能得到正確的結果了,而且不會影響小頁碼的頁面原查詢速度。
關於多屬性查詢問題的sphinx解決方案
需求描述 mysql中,每乙個文件都有多個標籤,查詢時可以篩選乙個標籤也可以篩選同時擁有多個標籤的文件。資料示例 文件 標籤 1 1,2,3,4,5 2 2,3,4,5,6 3 3,4,5,6,7 4 4,5,6,7,8 5 5,6,7,8,9 注意 這裡將文件id和標籤tagid的對應關係存入了f...
利用redis實現多屬性快速查詢
4.5k 次閱讀 讀完需要 7 分鐘 拿京東舉例,如下圖 我們要找一款電子琴,牌子有 山葉 卡西歐,有各種區間,各種顏色 不同的音色數。現如今動不動就得整點高併發啥的,直接用mysql我們是不是真的扛不住?在前面加一層cache?怎麼加?各種屬性的組合存到乙個屬性組合成的key中?如何相對實時的更新...
VC MFC多屬性頁的實現
vc mfc多屬性頁的實現 在插入 資源 dialog,中選擇多個從idd proppage large繼承的屬性頁,如idd prop1。這些建立的對話方塊就是屬性中的每一頁。用classwizard為你的屬性頁定義新的cpropertypage繼承類,如cprop1和idd prop1等關聯。用...