[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL/MyISAM. Не работает fulltext поиск
sadex13
Для простоты, сделал fulltext индекс только по одному полю, в нем и ищу. Поведение странное:
// выводит все строки таблицы
$sql = "SELECT *, MATCH content AGAINST ('$kw') FROM $tbl";

// не находит ничего
$sql = "SELECT * FROM $tbl WHERE MATCH (content) AGAINST ('$kw')";

$res = mysqli_query($link, $sql); // Выполняем запрос в БД

В обоих случаях запрос работает, но результат - либо ничего не найдено, либо везде найдено (все строки таблицы), независимо от условий поиска (слово, несколько слов).

Помогите, люди знающие - разное перепробовал, но без успеха.

UPD1. Тип поля, по которому ведется поиск - mediumtext.
linker
А тип поля TEXT или VARCHAR?

_____________
Gear Framework
Gear Framework на Github
linker
P.S. И ещё, FULLTEXT SEARCH не ищет при запросе менее чем 4 символа. Оно где-то меняется, но в моём случае лет 7 назад не помогло.

_____________
Gear Framework
Gear Framework на Github
Valick
только недавно отвечал и про длину белее трех символов, и про 50% соответсвия запросу, тоже не покажет, если БД мало записей, то такие траблы и возникают

_____________
Стимулятор ~yoomoney - 41001303250491
sadex13
linker, тип поля - mediumtext.
sadex13
Уфф, заработал запрос, который ничего не находил. Действительно, надо было критерий поиска задавать более 4-х символов. Спасибо всем, кто откликнулся.

Но запрос который выводил все записи - работает по-прежнему. В чем там дело? Вроде синтаксис правильный, но работает совсем по-другому.
linker
Условие задаётся в WHERE, а у тебя в SELECT, поэтому и выводятся все строки.

_____________
Gear Framework
Gear Framework на Github
sadex13
linker, я взял общепринятый синтаксис, который видел во многих статьях
$sql = "SELECT *, MATCH content AGAINST ('$kw') FROM $tbl";

Неужели это кривой синтаксис для php/mysql?
Valick
а как на счет почитать документалку
а не видел где-то там...

_____________
Стимулятор ~yoomoney - 41001303250491
sadex13
Valick, будешь смеяться, но я оттуда этот синтаксис и взял
Цитата
В следующем примере показано, как извлекать величины релевантности в явном виде. В случае отсутствия выражений WHERE и ORDER BY возвращаемые строки не упорядочиваются.
mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial') FROM articles;
Valick
не буду смеятся
Цитата
Описанная техника подсчета лучше всего работает для больших наборов текстов (фактически она именно для этого тщательно настраивалась). Для очень малых таблиц распределение слов не отражает адекватно их смысловое значение, и данная модель иногда может выдавать некорректные результаты.

не смешно
Цитата
Маловероятно, что слово, встречающееся в половине строк таблицы, определяет местонахождение релевантных документов. На самом деле, наиболее вероятно, что будет найдено много не относящихся к делу документов. Общеизвестно, что такое случается слишком часто при попытке найти что-либо в Интернет с помощью поисковых машин. Именно на этом основании подобным строкам должно быть назначено низкое смысловое значение в данном конкретном наборе данных.

вообще не смешно
Цитата
Следующий пример - более сложный. Запрос возвращает значение релевантности и, кроме того, сортирует строки в порядке убывания релевантности. Чтобы получить такой результат, необходимо указать MATCH() дважды. Это не приведет к дополнительным издержкам, так как оптимизатор MySQL учтет, что эти два вызова MATCH() идентичны, и запустит код полнотекстового поиска только однажды.

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');

и на закуску
Цитата
В логическом режиме полнотекстового поиска поддерживаются следующие операторы:

+
    Предшествующий слову знак ``плюс'' показывает, что это слово должно присутствовать в каждой возвращенной строке.
-
    Предшествующий слову знак ``минус'' означает, что это слово не должно присутствовать в какой-либо возвращенной строке.
    По умолчанию (если ни плюс, ни минус не указаны) данное слово является не обязательным, но содержащие его строки будут оцениваться более высоко. Это имитирует поведение команды MATCH() ... AGAINST() без модификатора IN BOOLEAN MODE.
< >
    Эти два оператора используются для того, чтобы изменить вклад слова в величину релевантности, которое приписывается строке. Оператор < уменьшает этот вклад, а оператор > - увеличивает его. См. пример ниже.
( )
    Круглые скобки группируют слова в подвыражения.
~
    Предшествующий слову знак ``тильда'' воздействует как оператор отрицания, обуславливая негативный вклад данного слова в релевантность строки. Им отмечают нежелательные слова. Строка, содержащая такое слово, будет оценена ниже других, но не будет исключена совершенно, как в случае оператора - ``минус''.
*
    Звездочка является оператором усечения. В отличие от остальных операторов, она должна добавляться в конце слова, а не в начале.
"
    Фраза, заключенная в двойные кавычки, соответствует только строкам, содержащим эту фразу, написанную буквально.

Ниже приведен ряд примеров:

apple banana
    находит строки, содержащие по меньшей мере одно из этих слов.
+apple +juice
    ... оба слова.
+apple macintosh
    ... слово ``apple'', но ранг строки выше, если она также содержит слово ``macintosh''.
+apple -macintosh
    ... слово ``apple'', но не ``macintosh''.
+apple +(>pie <strudel)
    ... ``apple'' и ``pie'', или ``apple'' и ``strudel'' (в любом порядке), но ранг ``apple pie'' выше, чем ``apple strudel''.
apple*
    ... ``apple'', ``apples'', ``applesauce'', и ``applet''.
"some words"
    ... ``some words of wisdom'', но не ``some noise words''.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.