Я пытаюсь выполнить поиск в MySQL, где у пользователя есть только одно поле. Таблица выглядит так:
ID BIGINT
TITLE TEXT
DESCRIPTION TEXT
FILENAME TEXT
TAGS TEXT
ACTIVE TINYINT
Теперь, если пользователь вводит только blah blubber
, поиск должен проверять, появляется ли каждое слово в полях TITLE
, DESCRIOTION
, FILENAME
или TAGS
. Сам результат должен быть упорядочен по релевантности, так как часто строка появляется в записи. Я получил эти данные для примера:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | blah | blah | bdsai | bdha | 1
2 | blubber | blah | blah | adsb | 1
3 | blah | dsabsadsab | dnsa | dsa | 1
В этом примере ID 2 должен быть вверху (2x blah, 1x blubber), затем 1 (2x blah) и затем 3 (1x blah). Этот процесс должен быть динамичным, чтобы пользователь мог также вводить больше слов, а релевантность работала так же, как для одного или нескольких слов.
Возможно ли это реализовать только в MySQL, или мне нужно использовать PHP? Как именно это будет работать?
Спасибо большое за помощь! С уважением, Флориан
РЕДАКТИРОВАТЬ: Вот результат после того, как я попробовал ответ Тома Мака:
У меня есть четыре записи, которые выглядят так:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
1 | s | s | s | s | 1
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
3 | 0 | s | s | s | 1
4 | a | a | a | a | 1
Теперь, если я буду искать строку s
, я должен получить только три верхние записи, отсортированные по релевантности s. Это означает, что записи должны быть упорядочены следующим образом:
ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1 <== 8x s
1 | s | s | s | s | 1 <== 4x s
3 | 0 | s | s | s | 1 <== 3x s
Теперь я попробовал свой запрос (имя таблицы PAGES
):
select t . *
from (
select
match(title) against('*s*' in boolean mode)
+ match(description) against('*s*' in boolean mode)
+ match(filename) against('*s*' in boolean mode)
+ match(tags) against('*s*' in boolean mode)
as matchrank,
bb . *
from pages bb) t
where t.matchrank > 0
order by t.matchrank desc
Этот запрос возвращает это:
matchRank | ID | TITLE | DESCRIPTION | FILENAME | TAGS | ACTIVE
2 | 2 | 0 | fdsadf | sdfs | a,b,c,d,e,f,s,a,a,s,s,as,sada | 1
Это из-за подстановочных знаков? Я думаю, что строка *s*
также должна найти значение, равное только s
...
ft_min_word_len
. Лучшая идея - изменить этот параметр на 1 и перезапустить mysql. В противном случае вы могли бы написать обходной путь, используяLIKE
, но он не будет работать слишком хорошо для более чем одной строки и менее 4 символов, например. ('SS') - person Tom Mac   schedule 28.10.2011