没有搜索的Sphinx过滤器

时间:2012-10-31 11:18:25

标签: sphinx

我需要获取过滤数据,而不需要搜索关键字。 基本上想象像这样的查询

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过滤的数据。

那么我如何获得这些数据?


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

上找到

编辑

如何按字符串列过滤,排序或分组而不使用字符串属性?

除了对多个索引进行精确的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表,但是卡在了问题上,我不能只是过滤,我也需要搜索一些关键字,这里我不需要...

2 个答案:

答案 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')