我正在尝试编写一个查询,它将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。
谢谢!
答案 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表。