0

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

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

当我SEARCH通过 shell 查询时,我按预期返回了所有结果信息。但是,当我使用 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”...索引“用户”:查询“NEWTON”:在 0.000 秒内返回 10 个匹配项,共 10 个

显示匹配项: 1. document=1,weight=2629,time=Thu Jan 1 00:33:32 1970 id=1 first_name=Joe last_name=Shmo company=Acme

JSON 格式的 PHP API 输出: { "error":"", "warning":"", "status":"good", "fields": ["name","code_name","code","description ","rating","angles","published","key_words","re​​ferenced_num","approved","used_num","avg_runtime","examples","editor","published_time"], "attrs" :{"time":2}, "matches": [ {"id":1,"weight":"1","attrs":{"time":2012}} ], "total":"1" , "total_found":"1", "time":"0.000", "words":{"posuere":{"docs":"1","hits":"2"}} }

4

3 回答 3

3

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

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

SELECT id, "1" as type FROM table1

sql_attr_uint = type

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

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

  1. 您需要确保 id 在结果集中出现的次数不会超过一次(通常建议的解决方案是将 id 填充 1000000 或通过某种类似的方式 - 我个人觉得这很糟糕)

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

就我个人而言,每次我想到一次搜索多个索引时,我最终都会单独搜索每个索引并呈现结果。

更新:添加了所需的 sql_attr_uint

于 2012-04-05T08:28:11.280 回答
1

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

  • 为每个对象类型(表或一组链接表)创建一个单独的 sphinx 索引
  • 改进您的对象编号以使对象识别成为可能,例如通过一些前缀。
于 2012-04-05T09:54:05.253 回答
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 密集型的

于 2012-04-10T09:46:34.863 回答