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

原文地址: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值





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章