0

Я пытаюсь изменить код для полного поиска пути из этого сообщения: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ в модели с вложенным набором для использования FULLTEXT вместо точного соответствия.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 ; 

Line beggining с И node.content, но мне кажется, что он не возвращает никаких результатов после выполнения процедуры. Я хотел бы иметь возможность получить второе, третье и n лучшее совпадение (возможно, используя LIMIT 1 OFFSET n, где n - номер результата?).

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

ответ

0

Это логически не разумно. Еще раз взгляните на ваш подзапрос.

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,, и если эта строка не содержит правильное «содержимое», тогда внешний запрос не возвращает строк ... или подзапрос не возвращает строк, потому что WHERE не удовлетворяет требованиям. Непонятно, что без дальнейшего анализа, но, как написано, запрос, похоже, не делает то, что вы намереваетесь.

Я считаю, что вы хотели это:

WHERE MATCH(tree.content) AGAINST ... 

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

Вы также можете найти значение в моем ответе на MYSQL matching one column to another in a different table via a FULLTEXT index на dba.SE, сайте Stack Exchange для администраторов баз данных. Конечно, под «другой таблицей» вопрос фактически ссылался на объединение, так что решение также полезно для присоединения таблицы к себе. Решение использует хранимую функцию, чтобы освободить ограничение от ссылки на столбец в AGAINST(), который вам не нужен, но он также обрабатывает LIMIT 1, чтобы получить скалярное значение.

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

 Смежные вопросы

  • Нет связанных вопросов^_^