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 ,然后过滤插入 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表,但是卡在了问题上,我不能过滤,我也需要搜索一些关键字,我在这里不需要......

4

2 回答 2

3

根据文档http://sphinxsearch.com/docs/archives/1.10/matching-modes.html

SPH_MATCH_FULLSCAN,匹配查询,强制使用“全扫描”模式,如下所示。注意,任何查询词都将被忽略,因此过滤器、过滤器范围和分组仍将被应用,但没有文本匹配。

你应该使用

$cl->setMatchMode(SPH_MATCH_FULLSCAN);
于 2014-02-07T09:35:47.810 回答
0

只需插入一个空查询字符串,例如 $sphinx->Query('','indexname')

于 2012-10-31T12:16:20.880 回答