MySQL FULLTEXT возвращает только лучший ответ

Я пытаюсь изменить код для получения полного пути из этого поста: 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 - это номер результата?).

Спасибо за вашу помощь

1 ответ

Это не логично. Посмотрите на свой подзапрос еще раз.

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

Ваш стол здесь tree, Указание соответствия столбцу в node не применяет никаких разумных критериев отбора к tree но будет соответствовать каждой строке в дереве, как если бы вы сказали WHERE 1 или же WHERE 1 = 1 или же WHERE 2+2 != 5 или нет строк в tree, как бы WHERE 1 = 0, Сервер возвращает все строки, LIMIT 1, и если эта 1 строка не обеспечивает правильное "содержимое", то внешний запрос не возвращает строк... или подзапрос не возвращает строк, потому что WHERE невозможно удовлетворить. Непонятно, что, без дальнейшего анализа, но, как написано, запрос, кажется, не делает то, что вы намерены.

Я полагаю, вы намеревались это:

 WHERE MATCH(tree.content) AGAINST ...

Я признаю, что не полностью убежден в правильности подхода, как решения того, чего вы действительно пытаетесь достичь, но это кажется логической ошибкой, которая объясняет "нет результатов".

Вы также можете найти значение в моем ответе MYSQL, сопоставляющем один столбец с другим в другой таблице, с помощью индекса FULLTEXT на dba.SE, сайте Stack Exchange для администраторов баз данных. Конечно, под "другой таблицей" вопрос фактически относится к объединению, так что решение также полезно для объединения таблицы с самим собой. Решение использует хранимую функцию, чтобы снять ограничение на ссылку на столбец в AGAINST(), который вам не нужен, но он также обрабатывает LIMIT 1 так что вы получите скалярное значение.

Однако... кажется, что если вам нужно несколько строк, скалярный подзапрос или хранимая функция тоже не верны. Вам нужна производная таблица, которую MySQL вызывает подзапросом в FROM оговорка Поддержка для LIMIT в производных таблицах зависит от версии сервера, IIRC.

Другие вопросы по тегам