我需要获取过滤数据,而不需要搜索关键字。 基本上想象像这样的查询
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和assignor id,但是api需要插入一个我不需要的查询字符串。我甚至没有字段来搜索字符串,我不需要它/。我需要的只是assignee_id或assignor_id过滤的数据。
那么我如何获得这些数据?
编辑
如何按字符串列过滤,排序或分组而不使用字符串属性?
除了对多个索引进行精确的arbtrary-length排序外,您可以完成所有这些操作。
要过滤和分组,您可以使用唯一的数字ID替换字符串。有时可以在数据库中创建查找字典(例如,对于城市或国家的固定列表),或者甚至使用现有字典,在该字典中用其ID替换字符串,然后对该ID进行过滤和分组。如果没有,您总是可以用其校验和替换字符串,例如。在索引时从MD5()获取的CRC32()或(任意)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文件中通过account_id过滤resource_account_share($cl->SetFilter('account_id',array('28'));
)
5)从resource_account_share索引获取数据并将此数据插入到重新编码表过滤器
$cl->SetFilter('id',array(data_fetched_from_resource_account_share));
这里可能有错误,因为它是动态写的,只是将一些真正的查询减少了一半,但是你明白了......我的问题是我不知道如何用sphinx链接那些表,那是为什么我想首先过滤resource_account_share表,但是卡在了问题上,我不能只是过滤,我也需要搜索一些关键字,这里我不需要...
答案 0 :(得分:2)
根据文件http://sphinxsearch.com/docs/archives/1.10/matching-modes.html
SPH_MATCH_FULLSCAN,使用“全扫描”模式强制匹配查询,如下所示。注意,任何查询字词都将被忽略,以便仍然会应用过滤器,过滤范围和分组,但不会进行文本匹配。
你应该使用
$cl->setMatchMode(SPH_MATCH_FULLSCAN);
答案 1 :(得分:0)
只需插入一个空查询字符串,例如$ sphinx-> Query('','indexname')