【问题标题】:Sphinx filter without search没有搜索的狮身人面像过滤器
【发布时间】:2012-10-31 11:18:25
【问题描述】:

我需要得到过滤数据,没有一些搜索关键字。 基本上想象这样的查询

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;

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='?')

? - 是 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
}

4) 然后在 php 文件中按 account_id ($cl->SetFilter('account_id',array('28'));) 过滤 resource_account_share

5) 从 resource_account_share 索引中获取数据并将此数据插入到记录表过滤器中

$cl->SetFilter('id',array(data_fetched_from_resource_account_share));

这里可能会出错,因为 a 是在运行中编写的,只是将一些真正的查询切成两半,但你明白了.....我的问题是我不知道如何将这些表与 sphinx 链接起来,那就是为什么我想先过滤resource_account_share表,但是卡在了问题上,我不能过滤,我也需要搜索一些关键字,我在这里不需要......

【问题讨论】:

    标签: sphinx


    【解决方案1】:

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

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

    你应该使用

    $cl->setMatchMode(SPH_MATCH_FULLSCAN);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我试过了......但我什么也没得到......我发现虽然是在问题的更新中,但我真的不知道该怎么做
      • @Viktor :这是过滤/排序/分组字符串的旧方法,但它已被弃用,因为有新的属性可以处理所有这些。最好发布您的 conf 和您尝试执行的代码。
      • 观看第二次编辑......我写了我想做的......我希望你能帮助我......因为我卡在它上面,并且不知道如何解决这个问题。
      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多