sphinx 同時使用多個索引進行檢索探究


2014年2月15日 11:24:34

結論:

1.一次性使用多個索引進行查詢的時候,返回的結果集中的fields字段沒有什么清楚的意義(也沒有找到文檔對它的說明)

2.如果程序中一次搜索使用了多個索引,如果它們配置文件中過濾用的屬性(aql_attr_uint,sql_field_string...)不全相同,那么最終返回的結果集中,只包含這幾個索引中共有的屬性

實驗:

建立兩個索引:goods_brand,  goods_cate, 分別是商品信息+品牌信息,商品信息+分類信息

 1  sql_query = select gid, gid as goodsid, siteid, catename from v_goods_info_cate
 2  sql_attr_uint = siteid
 3  sql_attr_uint = goodsid
 4  sql_field_string = catename
 5 
 6 #######################
 7 
 8  sql_query = select gid, gid as goodsid, siteid, brandname from v_goods_info_brand
 9  sql_attr_uint = siteid
10  sql_attr_uint = goodsid
11  sql_field_string = brandname

注:

1. brandname 是商品的品牌名字, catename是商品的分類名字

2. brandname, catename 在索引時,既作為全文索引,又作為屬性值返回

3. siteid在兩個索引中都有,brandname和catename只在各自的索引中存在

測試程序代碼

1 $sphObj->AddQuery($keyword, 'goods_brand');
2 $sphObj->AddQuery($keyword, 'goods_cate');
3 $sphObj->AddQuery($keyword, 'goods_cate, goods_brand');
4 $sphObj->AddQuery($keyword, 'goods_brand,goods_cate');
5 
6 var_dump($rs[0]['fields'], $rs[0]['words'], $rs[0]['matches']);

注:

在程序中做控制:搜索"機"這個字,在goods_cate和goods_brand索引中各只有兩條記錄符合要求(一共有4條記錄):

1.分別執行測試代碼的第1行和第2行,並用第6行打印出結果:

 1 //goods_brand
 2 array (size=1)
 3   0 => string 'brandname' (length=9)
 4 
 5 array (size=1)
 6   '機' => 
 7     array (size=2)
 8       'docs' => string '10049' (length=5)
 9       'hits' => string '10049' (length=5)
10 
11 array (size=2)
12   0 => 
13     array (size=3)
14       'id' => string '157978' (length=6)
15       'weight' => string '1' (length=1)
16       'attrs' => 
17         array (size=3)
18           'goodsid' => string '157978' (length=6)
19           'siteid' => string '102' (length=3)
20           'brandname' => string '無錫一機' (length=12)
21   1 => 
22     array (size=3)
23       'id' => string '157980' (length=6)
24       'weight' => string '1' (length=1)
25       'attrs' => 
26         array (size=3)
27           'goodsid' => string '157980' (length=6)
28           'siteid' => string '102' (length=3)
29           'brandname' => string '無錫一機' (length=12)
30 
31 //goods_cate
32 array (size=1)
33   0 => string 'catename' (length=8)
34 
35 array (size=1)
36   '機' => 
37     array (size=2)
38       'docs' => string '43986' (length=5)
39       'hits' => string '43986' (length=5)
40 
41 array (size=2)
42   0 => 
43     array (size=3)
44       'id' => string '158010' (length=6)
45       'weight' => string '1' (length=1)
46       'attrs' => 
47         array (size=3)
48           'goodsid' => string '158010' (length=6)
49           'siteid' => string '102' (length=3)
50           'catename' => string '磨齒機' (length=9)
51   1 => 
52     array (size=3)
53       'id' => string '158014' (length=6)
54       'weight' => string '1' (length=1)
55       'attrs' => 
56         array (size=3)
57           'goodsid' => string '158014' (length=6)
58           'siteid' => string '102' (length=3)
59           'catename' => string '旋壓機' (length=9)
View Code

注:

每個索引單獨被使用時,各對應兩條記錄(一共有4條記錄)

每條匹配記錄中的'attrs'中有siteid+brandname,或者,siteid+catename

 

2.當用一次查詢用多個索引時:分別執行第3行和第4行,並用第6行打印出結果:

 1 //goods_brand在前,goods_cate在后
 2 array (size=1)
 3   0 => string 'brandname' (length=9)
 4 
 5 array (size=1)
 6   '機' => 
 7     array (size=2)
 8       'docs' => string '54035' (length=5)
 9       'hits' => string '54035' (length=5)
10 
11 array (size=4)
12   0 => 
13     array (size=3)
14       'id' => string '157978' (length=6)
15       'weight' => string '1' (length=1)
16       'attrs' => 
17         array (size=2)
18           'goodsid' => string '157978' (length=6)
19           'siteid' => string '102' (length=3)
20   1 => 
21     array (size=3)
22       'id' => string '157980' (length=6)
23       'weight' => string '1' (length=1)
24       'attrs' => 
25         array (size=2)
26           'goodsid' => string '157980' (length=6)
27           'siteid' => string '102' (length=3)
28   2 => 
29     array (size=3)
30       'id' => string '158010' (length=6)
31       'weight' => string '1' (length=1)
32       'attrs' => 
33         array (size=2)
34           'goodsid' => string '158010' (length=6)
35           'siteid' => string '102' (length=3)
36   3 => 
37     array (size=3)
38       'id' => string '158014' (length=6)
39       'weight' => string '1' (length=1)
40       'attrs' => 
41         array (size=2)
42           'goodsid' => string '158014' (length=6)
43           'siteid' => string '102' (length=3)
44 
45 //goods_cate在前,goods_brand在后
46 array (size=1)
47   0 => string 'catename' (length=8)
48 
49 array (size=1)
50   '機' => 
51     array (size=2)
52       'docs' => string '54035' (length=5)
53       'hits' => string '54035' (length=5)
54 
55 array (size=4)
56   0 => 
57     array (size=3)
58       'id' => string '157978' (length=6)
59       'weight' => string '1' (length=1)
60       'attrs' => 
61         array (size=2)
62           'goodsid' => string '157978' (length=6)
63           'siteid' => string '102' (length=3)
64   1 => 
65     array (size=3)
66       'id' => string '157980' (length=6)
67       'weight' => string '1' (length=1)
68       'attrs' => 
69         array (size=2)
70           'goodsid' => string '157980' (length=6)
71           'siteid' => string '102' (length=3)
72   2 => 
73     array (size=3)
74       'id' => string '158010' (length=6)
75       'weight' => string '1' (length=1)
76       'attrs' => 
77         array (size=2)
78           'goodsid' => string '158010' (length=6)
79           'siteid' => string '102' (length=3)
80   3 => 
81     array (size=3)
82       'id' => string '158014' (length=6)
83       'weight' => string '1' (length=1)
84       'attrs' => 
85         array (size=2)
86           'goodsid' => string '158014' (length=6)
87           'siteid' => string '102' (length=3)
View Code

 注:

兩個索引被同時使用,只有先后順序不一樣時,4條記錄都得到了(這樣的結果是對的)

但是第3行和第47行的代碼鍵值對表明,返回的結果集中的fields值沒有什么特別的含義(至少我不知到,難道只和排在前邊的索引使用的全文索引字段同步?肯定有什么意義,只是我沒有總結到吧)

另外,查看結果知道,每一條匹配記錄的'attrs'數組中只有siteid鍵值對

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM