如何使用Group By和Group_Concat进行Sphinxsearch?

时间:2017-07-26 13:27:39

标签: php mysql group-by sphinx

我有一个带有id,数据和数据类型的Sphinx-Index-Table。

|    sphinxid    |    objectid    |      data      |     type    |
|----------------|----------------|----------------|-------------|
|        1       |       10       |  Lorem ipsum   |    title    |
|----------------|----------------|----------------|-------------|
|        2       |       10       | dolor si ipsum | description |
|----------------|----------------|----------------|-------------|
|        3       |       20       | dolor sit amet |     date    |

现在我尝试运行类似于这个工作的mysql查询的搜索查询:

SELECT objectid, GROUP_CONCAT(type) AS types 
FROM SphinxIndex 
WHERE data LIKE '%ipsum%'
GROUP BY objectid

这是我使用sphinxapi.php的PHP代码

    $cl = new SphinxClient();
    $cl->SetServer("localhost", 9312);
    $cl->SetMatchMode(SPH_MATCH_EXTENDED);
    $cl->SetLimits(0, 1000);
    $cl->SetRankingMode(SPH_RANK_SPH04);
    // THROWS ERR: can not aggregate non-scalar attribute 'datatype'
    $cl->SetSelect("objectid, GROUP_CONCAT(type) AS types");
    //----------------------------------------------
    $cl->SetGroupBy('objectid', SPH_GROUPBY_ATTR, '@count DESC');
    $cl->SetSortMode(SPH_SORT_EXTENDED, "@count DESC");
    $searchresults = $cl->Query('*' . 'ipsum' . '*');

我的预期结果是这样的,

|    objectid    |      types         |
|----------------|--------------------|
|        10      | title, description |

但不幸的是它引发了一个错误:

THROWS ERR: can not aggregate non-scalar attribute 'type'

我读到多值归因可能是问题的可能解决方案,但我并不真正了解这是如何运作的。

1 个答案:

答案 0 :(得分:0)

Sphinx不允许您聚合不是标量的字段(例如整数)。我假设type字段是针对某种参考值的。您可以使用另一个表格,例如type_dictionary

1 title
2 desctiption
3 date

并在主表中使用其索引:

sphinxid ... type
1            1
2            3
3            2

在这种情况下,GROUP_CONCAT可以正常工作。