關於多屬性查詢問題的sphinx解決方案

2021-09-08 17:09:31 字數 4074 閱讀 4288

需求描述

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等關聯。用...