我需要获取过滤数据,而不需要一些搜索关键字。基本上想象这样的查询
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 ,然后过滤插入 assignee id 和 assignor id ,但 api 需要插入一个我不需要的查询字符串。我什至没有搜索字符串的字段,也不需要它/。我只需要按 assignee_id 或 assignor_id 过滤数据。
那么我如何获得这些数据呢?
在http://sphinxsearch.com/info/faq/上找到编辑
如何在没有字符串属性的情况下按字符串列过滤、排序或分组?
除了对多个索引进行精确的任意长度排序之外,您可以执行所有这些操作。
要过滤和分组,您可以将字符串替换为唯一的数字 ID。有时可以在数据库中创建一个查找字典(例如,对于城市或国家的固定列表),或者甚至使用现有的字典,用该字典中的 ID 替换字符串,然后对该 ID 进行过滤和分组。如果没有,您总是可以用它的校验和替换字符串,例如。在索引时从 MD5() 中获取 CRC32() 或(任何)64 位(无需更改表!),分别使用 sql_attr_uint 或 sql_attr_bigint 存储它,然后对该校验和属性进行过滤或分组。(请注意,如果您有数百万个字符串,则存在一定的 CRC32() 冲突机会,但 MD5() 冲突的机会几乎为零。)
排序更难,但在某种程度上也是可能的。首先,您可以使用 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;
资源帐户共享
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='?')
? - 是 account 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
}
$cl->SetFilter('account_id',array('28'));
4)然后在php文件中通过account_id( )过滤resource_account_share
5) 从resource_account_share 索引中获取数据并将此数据插入到记录表过滤器中
$cl->SetFilter('id',array(data_fetched_from_resource_account_share));
这里可能会出错,因为 a 是在运行中编写的,只是将一些真正的查询切成两半,但你明白了.....我的问题是我不知道如何将这些表与 sphinx 链接,这就是我想要的原因先过滤resource_account_share表,但是卡在了问题上,我不能过滤,我也需要搜索一些关键字,我在这里不需要......