【问题标题】:SphinxSearch - setFilter working with sql_attr_multiSphinxSearch - 使用 sql_attr_multi 的 setFilter
【发布时间】:2013-04-30 07:16:50
【问题描述】:

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

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

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

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

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_package 代表项目编号。 8 应该是 2,我得到的是 1,witch 是项目号的包。 10.

如果我在sql_query 中添加WHERE project_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、公司

companies_projects:project_id、company_id、company_package、日期

编辑

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

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/10090158/…
  • 感谢您的快速回答,但这不是我打算做的。我将用详细的解释更新初始描述。
  • 你的 sql_query 是什么?因为我看不到 company_package 的索引位置...

标签: php mysql search sphinx


【解决方案1】:

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

您可以认为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 上的简单密钥)

【讨论】:

  • 感谢您的回答。我用查询摘录更新了描述,所以你可以看到问题。
  • 是的。这个答案向您展示了如何解决这个问题。您可能误解了 sphinx 的工作原理。它(以及索引器)运行您的 sql_query,并对输出进行索引。这就是索引中包含的全部内容。因此,您需要确保索引包含正确的数据。没有重复的文件。
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 2021-08-31
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多