Sphinx使用PHP API搜索多个表和聚合结果


Sphinx Search Multiple Tables and Aggregate Results Using PHP API

我正在尝试使用Sphinx搜索几个具有不同字段的MySQL表,并根据相关性将所有结果组合到一个集合中。

我为Sphinx配置了每个表的索引,并通过一次搜索所有索引成功地组合了结果。

当我通过shell使用SEARCH进行查询时,我会按预期返回所有结果信息。然而,当我使用PHP API时,结果只返回行的ID,因此无法判断它来自哪个表。

有没有办法让PHP API告诉我它来自哪个表/索引,这样我就可以进去查询实际数据了?

我正在考虑的另一种选择是尝试处理shell脚本的输出,但这似乎很混乱。

这是PHP:$search=$_GET['query'];//连接信息$sphinxClient=新的sphinxClient();$sphinxClient->SetServer('localhost',9312);$sphinxClient->SetMaxQueryTime(5000);

//Sphinx Result Configuration
$sphinxClient->SetMatchMode(SPH_MATCH_ANY);
$sphinxClient->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sphinxClient->SetLimits(0, 20);
// Give me back the results as an array
$sphinxClient->SetArrayResult(true);
$searchResults = $sphinxClient->Query( $search, 'user model' );

shell脚本很简单:

./search SEARCHTERM

其中SEARCHTERM是搜索

它输出的东西看起来像:

Sphinx 2.0.3版本(r3043)版权所有(c)2001-2011,Andrew Aksyonoff版权所有(c)2008-2011,斯芬克斯技术公司(http://sphinxsearch.com)

正在使用配置文件"/usr/local/sphinx/etc/sphinx.conf"。。。索引"user":查询"NEWTON":在0.000秒内返回了10个匹配项,共10个

显示匹配项:1.文档=1,重量=2629,时间=1970年1月1日星期四00:33:32id=1first_name=乔last_name=嘘company=Acme

JSON格式的PHP API输出:{"错误":","警告":","状态":"良好","fields":["name"、"code_name"、"code"、"description"、"rating"、"angles"、"published"、"key_words"、"referenced_num"、"approved"、"used_num"、"avg_runtime"、"examples"、,"属性":{"时间":2},"匹配":[{"id":1,"weight":"1","attrs":{"time":2012}}],"总计":"1","total_found":"1","时间":"0.000","words":{"posuere":{"docs":"1","hits":《2》}}}

我非常确定,当搜索API时,不仅会得到匹配的文档的Id,还会得到找到的文档的所有其他int值。

所以你可以尝试在你的源代码中添加一些类似的东西

SELECT id, "1" as type FROM table1
sql_attr_uint = type

现在type字段告诉您id来自的哪个表

但是,请注意,同时搜索不同表的多个索引会出现一些问题。

  1. 你需要确保id不会在你的结果集中出现不止一次(通常建议的解决方案是用1000000或类似的方式填充id——我个人觉得这很糟糕)

  2. 结果仅包含要搜索的第一个索引中的列。您需要确保所有源都返回相同的列。

就我个人而言,每次我想到同时搜索多个索引时,我都会分别搜索每个索引,并将结果显示出来。

更新:添加了sql_attr_uint所需的

Sphinx返回对象(行)id是正常的。问题出在你的模型上。如果你不能通过id来确定它是哪个对象,那么你的模型就是错误的。可能的选项有:

  • 为每个对象类型(表或一组链接表)创建单独的sphinx索引
  • 例如,通过一些前缀,改进对象计数,使对象识别成为可能

如果表具有相同的结构,则可以将union与sql查询一起使用

SELECT * FROM table1 WHERE id IN (ids,from,sphinx)
UNION
SELECT * FROM table2 WHERE id IN (ids,from,sphinx)
...
UNION
SELECT * FROM tableN WHERE id IN (ids,from,sphinx)

注意,这是cpu密集型