2012-10-31 61 views
0

我需要過濾數據,沒有一些搜索關鍵字。 基本上想象這樣的查詢沒有搜索的獅身人面像過濾器

select ras.resource_id 
from resource_account_share ras, resource_account_share_contract rasc, 
           contract cnt 
where ras.id=rasc.share_id and rasc.contract_id=cnt.id and 
           (cnt.assignor_id='28' or cnt.assignee_id='28'))) 

在我的sphinx.conf我設置屬性assignor_id和assignee_id,然後我濾波片插入受讓人ID和轉讓的ID,但API需要插入一個查詢字符串,我不需要。我甚至沒有字段來搜索字符串,我不需要它/。我需要的只是通過assignee_id或assignor_id過濾的數據。

那麼我如何獲得這些數據呢?


編輯http://sphinxsearch.com/info/faq/

發現如何過濾,排序或分組由字符串列不串屬性?

除了對多個索引進行精確的arbtrary-length排序之外,您可以執行所有這些操作。

要過濾和分組,您可以用一個唯一的數字ID替換字符串。有時候可以在數據庫中創建一個查找字典(例如,用於固定的城市或國家列表),甚至可以使用現有的字典,用該字典中的ID替換字符串,然後對該ID進行過濾和分組。如果沒有,你總是可以用它的校驗和替換字符串,例如。在索引時從MD5()中取出64位CRC32()或(any)64位(無需更改表!),分別使用sql_attr_uint或sql_attr_bigint進行存儲,然後對該校驗和屬性進行過濾或組合。 (請注意,如果您擁有數百萬個字符串但實際上沒有MD5()衝突的機會,則CRC32()碰撞有一定的機會。)

排序比較困難,但也可能在一定程度上。首先,您可以使用sql_attr_str2ordinal替換每個字符串的序號(在索引中提到的所有uniqie字符串的排序列表中的序號)。但是,一次查詢多個索引時會產生亂碼結果,因爲每個索引都將自己的順序號分配給相同的字符串。 IE瀏覽器。字符串「zzz」可能在索引A中爲1000,但在索引B中同時爲1,並且在搜索A + B時​​錯誤地浮動到頂部。其次,可以提取4字節或8字節的子字符串,將它們存儲爲屬性,然後對這些屬性進行排序。這將適用於不同的索引,但只能排序幾個第一個字節。

但是不太明白如何去做。


編輯#2

好了。基本上這是很多有一個巨大的SQL查詢表,但我會處理的少部分,使之成爲可能,這說明簡單我的問題,因爲一切都基本相同..所以...

記錄表

CREATE TABLE `recording` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(500) NOT NULL DEFAULT '' 
) ENGINE=InnoDB AUTO_INCREMENT=4888 DEFAULT CHARSET=utf8; 

Resource_account_share

CREATE TABLE `resource_account_share` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `resource_id` int(10) unsigned NOT NULL, 
    `account_id` int(10) unsigned NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=33392 DEFAULT CHARSET=utf8; 

MySQL查詢

select cmp.id, cmp.title_en as `title`, 
        date_format(cmp.released_date, '%d.%m.%Y') released_date, 
        cmp.ean, cmp.isrc, cmp.performers 
      from recording cmp 
      where 1=1 
      and (cmp.id in (select resource_id from resource_account_share where account_id='?') 

? - 是帳號ID,當搜索被引用時插入。

我敢肯定什麼,我試圖做的是與setSelect製作,但我不明白它是如何工作的,我的計劃是....

1)索引記錄表

2)向索引resource_account_share表

3)然後,我的sphinx.conf設置2個來源:源記錄和源resource_account_share

source recording 
{ 
    type   = mysql 

    sql_host  = localhost 
    sql_user  = user 
    sql_pass  = password 
    sql_db   = db 
    sql_port  = 3306 # optional, default is 3306 

    sql_query  = \ 
     select cmp.id, cmp.title_en as `title`,\ 
        date_format(cmp.released_date, '%d.%m.%Y') released_date,\ 
        cmp.ean, cmp.isrc, cmp.performers\ 
      from recording cmp 

    sql_attr_uint  = id 
    sql_query_info  = SELECT * FROM recording WHERE id=$id 
} 

source resource_account_share 
{ 
    type   = mysql 

    sql_host  = localhost 
    sql_user  = user 
    sql_pass  = password 
    sql_db   = db 
    sql_port  = 3306 # optional, default is 3306 

    sql_query  = \ 
     select resource_id from resource_account_share 

    sql_attr_uint  = account_id 
    sql_query_info  = SELECT * FROM recording WHERE id=$id 
} 

4)接着在PHP FIL通過ACCOUNT_IDË過濾resource_account_share($cl->SetFilter('account_id',array('28'));

5)獲取來自resource_account_share指數數據,並以recroding表濾波器插入此數據

$cl->SetFilter('id',array(data_fetched_from_resource_account_share)); 

這裏也許錯誤,因爲它寫在了蒼蠅,只是去掉一些真實查詢一半,但你的想法.....我的問題是,我不知道如何鏈接這些表與獅身人面像,這就是爲什麼我想只是先過濾resource_account_share表,但卡住了這個問題,我不能只是過濾,我需要搜索一些關鍵字,我不需要在這裏...

回答

0

只需插入一個空的查詢字符串,如$ sphinx->查詢( '', 'INDEXNAME')

+0

我想......我什麼都沒有....我發現雖然是在問題的更新,但我真的不知道要怎麼弄它 – Viktor

+0

@Viktor:這是一種舊的方式來過濾/排序/組字符串,但它是相當不贊成,因爲有新的屬性,可以處理所有的。更好地發佈您的conf和您嘗試執行的代碼。 – aditirex

+0

觀看第二次編輯....我寫了我想做的事情....我希望你能幫助我......因爲我被卡住了很糟糕,並且不知道如何解決這個問題。 – Viktor

2

根據文檔http://sphinxsearch.com/docs/archives/1.10/matching-modes.html

SPH_MATCH_FULLSCAN,匹配查詢,強行使用 「全掃描」 模式下面。注意,任何查詢術語都將被忽略,這樣過濾器,過濾器範圍和分組仍然會被應用,但是沒有文本匹配。

你應該使用

$cl->setMatchMode(SPH_MATCH_FULLSCAN);