0

可以在 sphinx api 中设置过滤器/条件以向配置选择添加“与”条件吗?(或表现得像一个“与”条件)?

SetFilter没有像我预期的那样工作,因为我正在使用sql_attr_multi它,它创建了一个包含找到匹配项的数组......并且排序定义的属性被最新的属性覆盖。

如果我在配置中设置“AND 条件”选择它可以正常工作,但我需要动态使用它。

或者也许使用sql_queryin php 来动态设置条件?

OR setSelect ("*, AND 条件")

编辑

我有 3 张桌子

-companies table
-projects table
-companies_projects table (company id, project_id, company_package)

同一家公司可能有多个项目。

每个项目的公司包可能不同(用于排序)。

sql_attr_multi = uint project from query; SELECT company_id, project_id FROM companies_projects

它会找到合适的公司,但如果该公司有多个项目,则项目属性变为 (8, 10)。

关于项目号 8 - 包是 2,
在项目编号上。10 - 包装为 1

我应用过滤器

$sphinxClient->setFilter('project', array(8));

问题是 company_package 被最后一个条目(在数据库中)覆盖,我不知道为什么。

所以company_packagefor项目没有。8 应该是 2,我得到的是 1,witch 是项目号的包。10.

如果我添加WHERE project_id = '8'工作sql_query正常,但我需要一个动态解决方案,所以我不需要为每个项目创建一个配置文件

编辑:

sql_query = \
     SELECT \
     id, company, \
     company_package, UNIX_TIMESTAMP(date) AS date \
     FROM companies AS c \
     INNER JOIN companies_projects AS cp ON c.id = cp.company_id

公司表:id,公司

公司项目:项目 ID、公司 ID、公司包、日期

编辑

 [1] => Array
            (
                [weight] => 1
                [attrs] => Array
                    (
                        [company_package] => 2
                        [date] => 1367224201
                        [project] => Array
                            (
                               [0] => 8
                            )
                    )
            )
 [2] => Array
            (
                [weight] => 1
                [attrs] => Array
                    (
                        **[company_package] => 1** it should be 2
                        [date] => 1367224202
                        [project] => Array
                            (
                                [0] => 8
                                [0] => 10
                            )
                    )
            )

我附上了一个例子。它会找到合适的公司。

第一个键没问题,因为公司没有。1 只是在项目 8 上

第二把钥匙不好,因为公司没有。2 两个都没有。8个和10个这样的项目:

公司 1,项目 8,包 = 2

公司 2,项目 8,包 = 2

公司 2,项目 10,包 = 1

所以,公司没问题,但是包被公司 2、项目 10、包 = 1 覆盖如果我删除这条记录......或者如果我添加 AND project_id=8 一切正常

4

1 回答 1

0

啊,你每家公司只得到一份文件。

你可以认为sql_query已经GROUP BY id结束了。(实际上并没有,但 sphinx 只会为每个 id 创建一个文档)

MVA 有效,因为它上面没有 GROUP BY。

我怀疑最简单的方法是每个公司/项目组合只有一个 sphinx 文档。也就是说,您实际上是直接索引company_projects,而不是company 表本身。

sql_query_pre = SET @id=1
sql_query = SELECT @id:=@id+1, company_id, project_id, company, \
   company_package, UNIX_TIMESTAMP(date) AS date \
   FROM companies_projects AS cp \
   INNER JOIN companies AS c ON (c.id = cp.company_id)
sql_attr_unit = company_id
sql_attr_unit = project_id

(不需要 MVA)

然后您可以在 project_id(或 company_id)上设置过滤器并获取正确的 company_package。

(这包括制作一个伪造的文档 ID - 因为您没有可以使用的 Companies_projects 上的简单密钥)

于 2013-04-30T13:40:20.070 回答