我正在尝试使用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”}} }
答案 0 :(得分:3)
我很确定在搜索API时,您不仅会获得匹配的文档的ID,还会找到找到的文档的所有其他int值。
因此,您可以尝试在源代码中添加类似
的内容SELECT id, "1" as type FROM table1
sql_attr_uint = type
和type
字段现在告诉您哪个表来自
但请注意,一次搜索不同表的多个索引存在一些问题。
你需要确保id在结果集中没有出现过一次(通常建议的解决方案是将id填充1000000或以类似方式填充 - 我个人认为这很糟糕)< / p>
结果仅包含要搜索的第一个索引中的列。您需要确保所有来源都返回相同的列。
我个人每次想到一次搜索多个索引时,我最终分别搜索每个索引并呈现结果。
更新:添加了所需的sql_attr_uint
答案 1 :(得分:1)
Sphinx返回对象(行)ID是正常的。问题出在您的模型中。如果您无法通过id确定它是哪个对象,那么您的模型是错误的。 可能的选择是:
答案 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密集型