【问题标题】:Joining on Multiple SphinxSE Tables In Single Query在单个查询中加入多个 SphinxSE 表
【发布时间】:2011-11-29 20:43:27
【问题描述】:

我正在尝试编写一个查询,将 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

谢谢!

【问题讨论】:

    标签: mysql sphinx


    【解决方案1】:

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

    Sphinx 当然不会向 mysql 提供真实的表。它假装它是一张桌子。它告诉 mysql 查询优化器通过索引工作得很好。所以优化器应该总是“首先”选择 SphinxSE 表,然后将它与真正的 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 表。

    【讨论】:

    • 顺便说一句,即使您实际上在连接右侧指定了 SphinxSE,查询优化器也应该将其翻转并放在首位。它不能用两个左连接来做到这一点。检查 EXPLAIN 输出。
    • 感谢 barryhunter:这是很多很好的信息。关于您所说的“一个 sphinxSE 表可以一次搜索多个 sphinx 索引”的一个问题......我该怎么做?当我在 MySQL 中定义 SphinxSE 表时,我必须将它指向一个特定的索引:我如何将它指向多个索引?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2015-02-24
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多