Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SphinxSearch-setFilter与sql_attr_multi一起工作_Php_Mysql_Search_Sphinx - Fatal编程技术网

Php SphinxSearch-setFilter与sql_attr_multi一起工作

Php SphinxSearch-setFilter与sql_attr_multi一起工作,php,mysql,search,sphinx,Php,Mysql,Search,Sphinx,可以在sphinx api中设置一个过滤器/条件,将“和”条件添加到配置选择中?(或表现得像“和”条件) SetFilter没有像我预期的那样工作,因为我使用的是sql\u attr\u multi,它创建了一个包含找到的匹配项的数组……排序定义的属性被最新的属性覆盖 如果我在配置中设置“AND condition”,选择它可以正常工作,但我需要友好地使用它 或者可以使用php中的sql\u查询以友好方式设置条件 或setSelect(“*,和条件”) 编辑 [1] => Array

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

SetFilter
没有像我预期的那样工作,因为我使用的是
sql\u attr\u multi
,它创建了一个包含找到的匹配项的数组……排序定义的属性被最新的属性覆盖

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

或者可以使用php中的
sql\u查询
以友好方式设置条件

或setSelect(“*,和条件”)

编辑

 [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
                            )
                    )
            )
我有三张桌子

-companies table
-projects table
-companies_projects table (company id, project_id, company_package)
同一家公司可能有多个项目

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

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

在第8号项目中,包是2,
关于第10号项目,包为1

我应用过滤器

$sphinxClient->setFilter('project', array(8));
问题是company_包被最后一个条目(在数据库中)覆盖了,我不知道为什么

因此,8号项目的
company\u包
应该是2,我得到的是1,这是10号项目的包

如果我在
sql\u query
中添加
WHERE project\u id='8'
可以正常工作,但是我需要一个动态解决方案,所以我不需要为每个项目创建配置文件

编辑:

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覆盖了
如果我删除了这个记录……或者如果我添加了project_id=8,一切都正常

啊,每个公司只有一个文档

您可以考虑“代码”> SqLyQuase结尾的ID为的<代码>组。(事实并非如此,但sphinx只会为每个id创建一个文档)

MVA是有效的,因为它上面没有群组

我想最简单的方法是,每个公司/项目组合只有一个sphinx文档。实际上,你可以直接索引公司的项目,而不是公司表本身

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)

然后您可以在项目id(或公司id)上设置过滤器,并获得正确的公司id包


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

这是否回答了您的问题?谢谢你的快速回答,但这不是我打算做的。我将用详细的解释更新初始描述。您的sql\u查询是什么?因为我看不到公司的软件包被编入了索引…谢谢你的回答。我用查询摘要更新了描述,因此您可以看到问题。是的。这个答案告诉你如何解决这个问题。你可能误解了斯芬克斯的工作原理。它(well indexer)运行sql\u查询,并对输出进行索引。这就是索引中包含的所有内容。因此,您需要确保索引包含正确的数据。没有重复的文件。