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

时间:2012-04-05 08:05:53

标签: php mysql sphinx

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

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

当我通过shell查询SEARCH时,我会按预期获得所有结果信息。但是,当我使用PHP API时,结果仅返回行的ID,因此无法分辨它来自哪个表。

有没有办法让PHP API告诉我它来自哪个表/索引,以便我可以进入并查询实际数据?

我正在考虑的替代方案是尝试处理shell脚本的输出,但这似乎很麻烦。

以下是PHP:         $ search = $ _GET ['query'];     //连接信息     $ sphinxClient = new 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-release(r3043) 版权所有(c)2001-2011,Andrew Aksyonoff 版权所有(c)2008-2011,Sphinx Technologies Inc(http://sphinxsearch.com)

使用配置文件'/usr/local/sphinx/etc/sphinx.conf'... index'user':查询'NEWTON':在0.000秒内返回10总共10次匹配

显示匹配项: 1. document = 1,weight = 2629,time = Thu Jan 1 00:33:32 1970     ID = 1     如first_name =乔     姓氏= Shmo     公司= Acme公司

JSON格式的PHP API输出:     {         “错误”:””,         “警告”:””,         “状态”:“好”,         “fields”:[“name”,“code_name”,“code”,“description”,“rating”,“angles”,“published”,“key_words”,“referenced_num”,“approved”,“used_num”,“ avg_runtime”, “例子”, “编辑”, “published_time”],         “ATTRS”:{ “时间”:2},         “火柴”:         [             { “ID”:1, “重量”: “1”, “ATTRS”:{ “时间”:2012}}         ]         “总”: “1”,         “total_found”: “1”,         “时间”: “0.000”,         “字”:{ “posuere”:{ “文档”: “1”, “命中”: “2”}}     }

3 个答案:

答案 0 :(得分:3)

我很确定在搜索API时,您不仅会获得匹配的文档的ID,还会找到找到的文档的所有其他int值。

因此,您可以尝试在源代码中添加类似

的内容
SELECT id, "1" as type FROM table1

sql_attr_uint = type

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

但请注意,一次搜索不同表的多个索引存在一些问题。

  1. 你需要确保id在结果集中没有出现过一次(通常建议的解决方案是将id填充1000000或以类似方式填充 - 我个人认为这很糟糕)< / p>

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

  3. 我个人每次想到一次搜索多个索引时,我最终分别搜索每个索引并呈现结果。

    更新:添加了所需的sql_attr_uint

答案 1 :(得分:1)

Sphinx返回对象(行)ID是正常的。问题出在您的模型中。如果您无法通过id确定它是哪个对象,那么您的模型是错误的。 可能的选择是:

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

答案 2 :(得分:0)

如果表具有相同的结构,则可以使用与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密集型