我正在尝试编写一个查询,将来自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'lookups'强制结果返回为空。

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

谢谢!

最佳答案

不,这行不通。这是因为sphinxSE / mysql的“结构”。

Sphinx当然不会向mysql提供真实的表。它装出一张桌子。它通过索引告诉mysql查询优化器工作得很好。因此,优化程序应始终首先选择SphinxSE表,然后将其与真实的mysql表连接。

因此,对于每一行,它都会在SphinxSE表上进行索引扫描,从而获取doc_id。然后在原始表(联接本身)中查找它们。

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

...您的查询(使用左联接)迫使mysql将sphinxSE表(不少于其他表!)放在右侧,这根本行不通。



您需要将查询重新构造为单个sphinxSE表。一个sphinxSE表可以一次搜索多个sphinx索引。或者可以将您的实际索引修改为一次索引。

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

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

...生成一个sphinxSE表(在连接的左侧:))。



更新后添加:

创建一个sphinxSE一次搜索两个索引(例如sql UNION),可以确定

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


但即使您不能,在查询时覆盖它也绝对可以工作,例如docs中的示例:

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


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

关于mysql - 在单个查询中联接多个SphinxSE表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8317460/

10-12 06:58