【问题标题】:MySQL FULLTEXT returning only best answerMySQL FULLTEXT 只返回最佳答案
【发布时间】:2017-01-29 18:33:28
【问题描述】:

我正在尝试修改从这篇文章中检索全路径的代码: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 在嵌套集模型中使用 FULLTEXT 而不是完全匹配。

这就是我想要的:我想获得从 MATCH() AGAINST() 搜索的最佳匹配,而不是使用 '=' 符号只找到这一个结果。

这是我尝试过的:

DELIMITER //
DROP PROCEDURE IF EXISTS find_node;
//

CREATE DEFINER = CURRENT_USER PROCEDURE find_node (
        IN searched TEXT
)

proc: BEGIN

    SELECT DISTINCT parent.content
    FROM tree AS node,
             tree AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.content = (SELECT content FROM tree WHERE MATCH(node.content) AGAINST(searched IN BOOLEAN MODE) LIMIT 1)
    ORDER BY parent.lft;

END //
DELIMITER ;

以 AND node.content 开头的行,但运行该过程后似乎没有返回任何结果。 我也希望能够获得第二、第三和 n 最佳匹配(也许使用 LIMIT 1 OFFSET n,其中 n 是结果编号?)。

感谢您的帮助

【问题讨论】:

    标签: mysql subquery full-text-search hierarchical-data hierarchical-query


    【解决方案1】:

    这在逻辑上是不明智的。再看看你的子查询。

    SELECT content 
      FROM tree /* << tree? */ 
     WHERE MATCH(node.content) /* << node? */ ...
    

    你的桌子是tree。为node 中的列指定匹配项不会对tree 应用任何明智的选择标准,但会匹配树中的每一行,就像您说WHERE 1WHERE 1 = 1WHERE 2+2 != 5 一样,或者没有行在tree 中,WHERE 1 = 0 也是如此。服务器返回所有行,LIMIT 1,,如果该 1 行没有提供正确的“内容”,则外部查询不返回任何行……或者子查询不返回任何行,因为 WHERE 无法满足。目前尚不清楚,没有进一步分析,但正如所写,查询似乎没有按照您的意图进行。

    我相信你是故意的:

     WHERE MATCH(tree.content) AGAINST ...
    

    我承认我并不完全相信这种方法的有效性,作为你真正想要完成的解决方案,但这似乎是一个逻辑错误,可以解释“没有结果”。

    您还可以在我对 dba.SE 上的 MYSQL matching one column to another in a different table via a FULLTEXT index 的回答中找到价值,该站点是面向数据库管理员的 Stack Exchange 站点。当然,通过“不同的表”,问题实际上是指连接,因此该解决方案对于将表连接到自身也很有用。该解决方案使用存储函数来解除对引用 AGAINST() 中的列的限制,这是您不需要的,但它还处理 LIMIT 1 以便您获得标量值。

    但是...如果您想要多行,标量子查询或存储函数似乎也不正确。您需要一个派生表,MySQL 将其称为subquery in the FROM clause。派生表中对 LIMIT 的支持因服务器版本 IIRC 而异。

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 2014-12-04
      • 2011-08-08
      • 1970-01-01
      • 2022-11-11
      • 2021-11-11
      • 2016-05-28
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多