在单个查询中加入多个SphinxSE表

时间:2011-11-29 20:43:27

标签: mysql sphinx

我正在尝试编写一个查询,它将MySQL中的一些表与两个SphinxSE表连接起来。它基本上是一个“每行有两个名字”类型的数据库,而这两个名字都是一个链接到SphinxSE表的索引......我的目标是做一个基本上是“其中一个名字匹配这个字符串的搜索在斯芬克斯“。

我尝试使用的查询是:

SELECT * from names
LEFT JOIN name_1_se ON name_1_se.id=names.name_1_id
LEFT JOIN name_2_se ON name_2_se.id=names.name_2_id
WHERE name_1_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000')
OR name_2_se.query=('some random name;mode=phrase;limit=100000;maxmatches=100000')

(name_1_se和name_2_se表是SphinxSE表)。

如果我在where中只使用一次查找,它工作正常...添加第二个子句(任一个)强制两个SphinxSE'查找'强制结果返回空。

我正在尝试做什么,或者它是SphinxSE的已知问题?我在Sphinx网站上找到的最接近的是2008年的这个错误http://sphinxsearch.com/bugs/view.php?id=255

谢谢!

1 个答案:

答案 0 :(得分:2)

不,这不行。这是因为sphinxSE / mysql的'artitecture'。

Sphinx当然不会向mysql提供真正的表格。它假装一张桌子。它告诉mysql查询优化器通过索引很好地工作。所以优化器应该总是选择SphinxSE表'first',然后将它与真正的mysql表连接起来。

因此,对于每一行,它在SphinxSE表上执行索引扫描,该表获取doc_ids。然后它在原始表(连接本身)中查找它们。

SphinxSE不能存在于Join的“右侧”。始终必须是第一个(或左)。

...你的查询(使用左连接)迫使mysql将sphinxSE表(井表不少于!)放在右边,这根本不会起作用。


您需要将查询重命名为单个sphinxSE表。 sphinxSE表可以一次搜索多个sphinx索引。或者也许可以改革你的实际指数来制作一次指数。

请记住每个索引可以有多个字段 - 因此也许可以使用扩展查询

(@ field1“一些随机名称”)| (@ field2“一些随机名称”)

...结果一个sphinxSE表(在连接的左边:))。


已更新以添加:

创建一个sphinxSE来一次搜索两个索引(比如一个sql UNION),确定你可以做到

CREATE TABLE ... CONNECTION="sphinx://localhost:9312/index1,index2";

但即使你不能,在查询时覆盖它肯定会有效,例如来自文档:

... WHERE query='test;index=test1,test2,test3;';

表中定义的索引将被忽略,因此可以使用任何sphinxSE表。