[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: FULLTEXT VS LIKE
GET
Приветствую.

3 дня бьюсь так и не могу прийти к конкретному решению.
Вопрос собственно в теме.

Задача:
Есть Таблица(ы) в ней обычно одно(максимум 3) поля типа varchar.
В эти поля можно вписать все что угодно.

Как осуществить поиск по эти полям?

Как вижу решение.

Исходный запрос, например:PHP форум в России
1. Разбиваем исходный запрос юзера на слова, исходя из минимальной длинны слова, например от 3 букв и больше.
PHP форум России

2. Определяем максимальное количество слов для поиска, например 2 слова.
PHP форум

Дальше варианты:
1. Искать при помощи LIKE %WORD% - индекс бесполезен
2. Искать при помощи LIKE WORD% - обычный индекс по ID
3. Искать при помощи AGAINST WORD - индекс FULLTEXT

Если будем искать по всему полю, то подходят варианты 1 и 3, но в 1 не работает индекс, поэтому варианты только 2 и 3.

Как вариант конечно, можно разбирать морфологию слова, определять теги запроса и искать эти теги в заранее созданной таблице тегов и дальше определяя их id искать эти id в поле varchar состоящим из цифр - id тегов.

Но, как мне кажется, грамотно составить морфологию слова очень сложно, еще сложнее построить такую концепцию тегов: приставка - корень - окончание, связать их во фразу.

Чувство такое, что нужны не малые деньги на сервер(а), которые бы тянул такой грамотно спланированный поиск.

Но все же хочется сделать что-нибудь хорошее.
Итак два варианта:

2. Искать при помощи LIKE WORD% - обычный индекс по ID
3. Искать при помощи AGAINST WORD - индекс FULLTEXT

Сделал таблицу из 6000 строк.
Каждая строка - строка из Гамлета.

Искал слово "Гамлет":
При помощи LIKE: 0,005-0,006 секунд
При помощи FULLTEXT: 0,007-0,008 секунд

LIKE плюсы:
При помощи LIKE быстрее примерно в 1,5 раза.
LIKE минусы: ищет только первое слово. Найдет "Гамлет", но не найдет "мертвый Гамлет".

FULLTEXT плюсы:
Найдет "мертвый Гамлет".
FULLTEXT минусы:
Медленнее в 1,5 раза по сравнению с LIKE.
Вставка новой строки с индексом FULLTEXT заметно медленнее в 10-20 раз, зависит от объема.

Что думаете?


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Nikitian
Разница скоростей работы на 6000 записях в пределах погрешности. Сделайте тесты на миллионе записей хотя бы.
GET
Цитата
Разница скоростей работы на 6000 записях в пределах погрешности. Сделайте тесты на миллионе записей хотя бы.


Сделал 281,775 записей.

Искал слово "Офелия":
При помощи LIKE: 0.0094-0.0097 секунд
При помощи FULLTEXT: 0.026-0.029 секунд

Разница в 2,76 раза.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Искал слово "Гамлет":
При помощи LIKE: 0.0204 - 0.0210 секунд
При помощи FULLTEXT: 0.112-0.115 секунд

Разница в 5,5 раза.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
ABC, вы слово FULLTEXT понимаете?
Какой Гамлет, какая Офелия, вы найдите с помощью LIKE целое предложение, тогда и сравните результаты.


_____________
Стимулятор ~yoomoney - 41001303250491
Hello
Думаю что давно пора перестать насиловать БД и использовать Sphinx

_____________
VPS от 5$, первые 2 месяца - бесплатно.
GET
Valick

Какой Гамлет такая и Офелия, больше книжек читайте.
Мне нужно найти ключевые слова и я их нашел.

Если не понятно...ищу слова например запроса Задний Бампер. Ключевые слова
Задний и Бампер.

Найдет LIKE Задний бампер? - найдет.
Найдет LIKE просто бампер? - найдет.
FULLTEXT найдет все... включай передний бампер.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
ABC, у нас с вами не литературный кружок, так что книги читайте вы и желательно околопрограммистские. Вы сравниваете жуй с сальцем и проводите "на умняке" еще какие-то тесты.
Чесно скажу, у меня даже аргументов нет с вами спорить, это все равно что в бетонную стену орать.


_____________
Стимулятор ~yoomoney - 41001303250491
GET
Valick

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

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
ABC, минусик мне в карму по вашему меня должен испугать?
Это я грублю? Называя вас на вы, в то время как вы мне тычите?
Если я пишу не по теме и и вы и сами такой умный, зачем было создавать тему?
Я даже не буду просить модераторов почистить мне ауру. Пусть люди по достоинству оценят вашу "адекватность".

_____________
Стимулятор ~yoomoney - 41001303250491
GET
Valick

Отдыхай уже дружище. biggrin.gif
Тебе уже не первый раз люди пишут, чтоб ты успокоился и ничего не писал.
Вот к примеру тебе написали:

Цитата
Здесь может оказаться человек, который поймет весь трагизм ситуации, и поможет решить трабл. А не будет, что то писать ради писанины.
И вам до сих пор непонятно для чего сие может понадобиться?


http://phpforum.ru/index.php?showtopic=71278


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
ABC, "свинья везде грязь найдет" smile.gif


_____________
Стимулятор ~yoomoney - 41001303250491
inpost
LIKE ищет только от начала строки, подойдет для маленьких записей, вроде названий городов, FULLTEXT - слова внутри длинных предложений, потому что там идёт разбивка по словам. Там более сложная система закладок, не такая, что
А
АВ
АВС,

А уже:
ABC: в записях ID: xxx,xxx,xxx,xxx , при этом надо сначала добраться до ABC через индесы, а потом уже до самих записей

Вроде как и должно работать так, как ты показал. Логика в порядке вещей и совпадает с разумным пониманием того, что сделать быстрее.

К тому же ответили выше, что для этих целей всё же лучше использовать: Sphinx

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
GET
inpost

Ок. Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:

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