原文地址:http://www.cnblogs.com/littlehb/p/3667821.html
需求描述
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值