可以在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一切正常
答案 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 - 因为您没有关于您可以使用的公司项目的简单密钥)