Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум WOweb > SQL > Поиск...


Автор: Nik Вторник, 18 Ноября 2003, 15:25
Хотел сделать поиск по базе.
Столкнулся с такой проблемой - мне надо сделать такой поиск, чтобы:
1. Игнорировал регистр строки;
2. Мог искать по словам, разделенные пробелом.
Например, строка $s = "word1 word2 word3";
Количество слов не известно, но надо, что SELECT выдавал все записи, которые удовлетворяют хоть одному из слов...
Была идею разбить строку на массив, но это на мой взгляд не удобно - много запросов получится тогда.
Какие будут варианты? smile.gif

Автор: asam Вторник, 18 Ноября 2003, 15:47
Если у тебя поля, по которым надо делать поиск, типа 'TEXT' ,
то всё просто - объявляешь поле как 'FULLTEXT'
1. В типе 'TEXT' при поиске регистр не учитывается
2. запрос :
SQL
SELECT id,txt FROM table WHERE MATCH(txt) AGAINST ('$s')

возвратит все строки , соответствующие твоему запросу - при этом пробелы между словами будут рассматриватся как разделители.
запрос
SQL
SELECT id,txt,MATCH(txt) AGAINST ('$s')
as rel FROM table WHERE MATCH(txt) AGAINST ('$s') ORDER BY rel DESC

сделает тоже самое , но строки будут отсортированы по реавалантности

Автор: Nik Вторник, 18 Ноября 2003, 16:00
asam, сенкс smile.gif
Пойду проверять...

Автор: Nik Среда, 03 Декабря 2003, 20:18
Отлично, код работает!
Но, можно ли немного изменить параметры поиска?
Чтобы искать к примеру по части слова.
Как это реализовать? unsure.gif

Автор: asam Четверг, 04 Декабря 2003, 9:10
Если я правильно тебя понял , тогда есть - IN BOOLEAN MODE
SQL
SELECT id,txt,MATCH(txt) AGAINST ('$s')
as rel FROM table WHERE MATCH(txt) AGAINST ('$s' IN BOOLEAN MODE ) ORDER BY rel DESC

где '$s' помимо собственно строки поиска может содержать
QUOTE

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


Всё это можно прочитать http://www.mysql.com/doc/ru/Fulltext_Search.html

Автор: Nik Четверг, 04 Декабря 2003, 18:13
Сделал такой запрос, но он выдает ошибку синтаксиса...
SQL
SELECT id FROM table WHERE MATCH(txt) AGAINST ('test*' IN BOOLEAN MODE)

Где ошибка может быть?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)