Приветствую.
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
12.02.2013 - 13:28
Разница скоростей работы на 6000 записях в пределах погрешности. Сделайте тесты на миллионе записей хотя бы.
Цитата |
Разница скоростей работы на 6000 записях в пределах погрешности. Сделайте тесты на миллионе записей хотя бы. |
Сделал 281,775 записей.
Искал слово "Офелия":
При помощи LIKE: 0.0094-0.0097 секунд
При помощи FULLTEXT: 0.026-0.029 секунд
Разница в 2,76 раза.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Искал слово "Гамлет":
При помощи LIKE: 0.0204 - 0.0210 секунд
При помощи FULLTEXT: 0.112-0.115 секунд
Разница в 5,5 раза.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
12.02.2013 - 13:55
ABC, вы слово FULLTEXT понимаете?
Какой Гамлет, какая Офелия, вы найдите с помощью LIKE целое предложение, тогда и сравните результаты.
_____________
Стимулятор ~yoomoney - 41001303250491
Думаю что давно пора перестать насиловать БД и использовать Sphinx
_____________
VPS от 5$, первые 2 месяца -
бесплатно.
Valick
Какой Гамлет такая и Офелия, больше книжек читайте.
Мне нужно найти ключевые слова и я их нашел.
Если не понятно...ищу слова например запроса Задний Бампер. Ключевые слова
Задний и Бампер.
Найдет LIKE Задний бампер? - найдет.
Найдет LIKE просто бампер? - найдет.
FULLTEXT найдет все... включай передний бампер.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
12.02.2013 - 14:19
ABC, у нас с вами не литературный кружок, так что книги читайте вы и желательно околопрограммистские. Вы сравниваете жуй с сальцем и проводите "на умняке" еще какие-то тесты.
Чесно скажу, у меня даже аргументов нет с вами спорить, это все равно что в бетонную стену орать.
_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Я помню не так давно тебе уже писали люди в ветке для новичков, чтоб ты не писал, когда тебе нечего писать, потому как твои измышления никому неинтересны. Тебя же никто не заставляет сидеть и отвечать в моей теме, тем более, когда ты не так умен, как тебе хотелось бы.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
12.02.2013 - 14:58
ABC, минусик мне в карму по вашему меня должен испугать?
Это я грублю? Называя вас на вы, в то время как вы мне тычите?
Если я пишу не по теме и и вы и сами такой умный, зачем было создавать тему?
Я даже не буду просить модераторов почистить мне ауру. Пусть люди по достоинству оценят вашу "адекватность".
_____________
Стимулятор ~yoomoney - 41001303250491
ValickОтдыхай уже дружище.

Тебе уже не первый раз люди пишут, чтоб ты успокоился и ничего не писал.
Вот к примеру тебе написали:
Цитата |
Здесь может оказаться человек, который поймет весь трагизм ситуации, и поможет решить трабл. А не будет, что то писать ради писанины. И вам до сих пор непонятно для чего сие может понадобиться? |
http://phpforum.ru/index.php?showtopic=71278
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Valick
12.02.2013 - 15:37
ABC, "свинья везде грязь найдет"
_____________
Стимулятор ~yoomoney - 41001303250491
inpost
22.02.2013 - 23:18
LIKE ищет только от начала строки, подойдет для маленьких записей, вроде названий городов, FULLTEXT - слова внутри длинных предложений, потому что там идёт разбивка по словам. Там более сложная система закладок, не такая, что
А
АВ
АВС,
А уже:
ABC: в записях ID: xxx,xxx,xxx,xxx , при этом надо сначала добраться до ABC через индесы, а потом уже до самих записей
Вроде как и должно работать так, как ты показал. Логика в порядке вещей и совпадает с разумным пониманием того, что сделать быстрее.
К тому же ответили выше, что для этих целей всё же лучше использовать: Sphinx
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
inpost
Ок. Спасибо.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.