SphinxSearch - 使用sql_attr_multi的setFilter

时间:2013-04-30 07:16:50

标签: php mysql search sphinx

可以在sphinx api中设置过滤器/条件,为配置选择添加“AND”条件吗? (或表现得像'AND'条件)?

SetFilter没有按照我的预期工作,因为我正在使用sql_attr_multi,它会创建一个找到匹配的数组...并且排序定义的属性会被最新的匹配。

如果我在配置中设置'AND condition'选择它可以正常工作,但我需要使用它。“

或者也许使用php中的sql_query来设置条件?

OR setSelect(“*,AND condition”)

修改

我有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

找到合适的公司,但如果公司在多个项目上,那么项目attr就会变成(8,10)。

项目编号8 - 包装是2,
在项目号。 10 - 包裹是1

我应用过滤器

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

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

所以项目号为company_package。 8应该是2,我得到1代替,女巫是项目没有的包。 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,公司

companies_projects:project_id,company_id,company_package,date

修改

 [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一切正常

1 个答案:

答案 0 :(得分:0)

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

您可以认为sql_query最后加GROUP BY id了。 (它确实没有,但是sphinx只会为每个id创建一个文档)

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

我怀疑最容易的是每个公司/项目组合只有一个sphinx文档。即您实际上直接索引companies_projects,而不是公司表本身。

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)上设置setFilter并获得正确的company_package。

(这包括制作假文件ID - 因为您没有关于您可以使用的公司项目的简单密钥)