我需要過濾數據,沒有一些搜索關鍵字。 基本上想象這樣的查詢沒有搜索的獅身人面像過濾器
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表,但卡住了這個問題,我不能只是過濾,我需要搜索一些關鍵字,我不需要在這裏...
我想......我什麼都沒有....我發現雖然是在問題的更新,但我真的不知道要怎麼弄它 – Viktor
@Viktor:這是一種舊的方式來過濾/排序/組字符串,但它是相當不贊成,因爲有新的屬性,可以處理所有的。更好地發佈您的conf和您嘗試執行的代碼。 – aditirex
觀看第二次編輯....我寫了我想做的事情....我希望你能幫助我......因爲我被卡住了很糟糕,並且不知道如何解決這個問題。 – Viktor