dongnuo4594 2013-04-30 07:16
浏览 61
已采纳

SphinxSearch - 使用sql_attr_multi的setFilter

It is possible to set a filter/condition in the sphinx api to add an 'AND' condition to the config select? (or to act like an 'AND' condition) ?

SetFilter doesnt work as I expected, because I'm using sql_attr_multi, it creates an array with found matches...and the sort defined attributes are overwritten by the newest ones.

If I set 'AND condition' in the config select it works properly, but I need to use it dinamically.

Or maybe to use the sql_query in php to set the conditions dinamically?

OR setSelect ("*, AND condition")

Edit

I have 3 tables

-companies table
-projects table
-companies_projects table (company id, project_id, company_package)

The same company could be on multiple projects.

The company package could be different on every project (for sorting).

sql_attr_multi = uint project from query; SELECT company_id, project_id FROM companies_projects

It finds the right companies but if the company is on multiple projects, the project attr becomes (8, 10).

On project no. 8 - the package is 2,
On project no. 10 - the package is 1

I apply the filter

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

The problem is that the company_package is overwritten by the last entry (in the database) and I don`t know why.

So the company_package for project no. 8 should be 2, I`m getting 1 instead, witch is the package for project no. 10.

If I add WHERE project_id = '8' in sql_query is working fine, but I need a dynamic solution so I don`t need to create a config file for every project

Edit:

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

companies table: id, company

companies_projects: project_id, company_id, company_package, date

Edit

 [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
                            )
                    )
            )

I atached an example. It finds the right companies.

The first key is ok because the company no. 1 is just on project no.8

The second key is not good because the company no. 2 is on both no. 8 and 10 projects like this:

company 1, project 8, package = 2

company 2, project 8, package = 2

company 2, project 10, package = 1

So, the companies are ok, but the package is overwriten from the company 2, project 10, package = 1 If I delete this record...or if I add AND project_id=8 everything is ok

  • 写回答

1条回答 默认 最新

  • duanchuiwen6694 2013-04-30 13:40
    关注

    Ah, you getting just one document per company.

    You can consider that the sql_query has GROUP BY id tacked on the end. (it doesnt really, but sphinx will only create one document per id)

    The MVA works, because it has it doesnt have a GROUP BY on it.

    I suspect the easiest would be to just have one sphinx document per company/project combo. Ie you in effect directly indexing the companies_projects, not the companies table itself.

    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
    

    (no need for the MVA)

    Then you can setFilter on project_id (or company_id) and get the right company_package.

    (This includes making a fake document ID - because you have no simple key on companies_projects you can use)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大