Php SphinxSearch-setFilter与sql_attr_multi一起工作
可以在sphinx api中设置一个过滤器/条件,将“和”条件添加到配置选择中?(或表现得像“和”条件)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
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查询,并对输出进行索引。这就是索引中包含的所有内容。因此,您需要确保索引包含正确的数据。没有重复的文件。