情景:
有一個商品表goods,一個商品對應多個種類標籤。如下結構:
goods_id type_ids
1 1,2,3
2 2,3,4
3 3,4,5
當我要查找種類為4的商品id的時候,就要用到sphinx的多屬性配置了。
主要配置如下:
source src1
{
type = mysql
sql_host = 127.0.0.1
sql_user = search
sql_pass =
sql_db = test
sql_query = select goods_id,type_ids from goods
sql_attr_multi = uint type_ids from field;#配置type_ids為多屬性
sql_ranged_throttle = 0
}
然後我們在php中可以這樣搜索過濾了:
$sphinx->setFilter('type_id', array(2,3,4));
是表示含有标签值2,3,4中的任意一个即符合筛选,这里是or关系。
$sphinx->setFilter('type_id', array(2));
$sphinx->setFilter('type_id', array(3));
$sphinx->setFilter('type_id', 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值