Правильный поиск по базе - каков он?

12 3
humbert
На сайте с 16.03.2006
Offline
536
1868

MySQL, всегда пользовался обычным Like '%фраза%' для реализации поиска на сайте. Но если база достаточно большая, то like будет работать медленно.

Пришла идея сделать библиотеку слов и таблицу соответствия слова нужному объекту, т.е. есть таблица слов с полями: ID слова, слово. И есть вторая таблица: ID слова, ID объекта

Но, при выдаче результатов поиска хотелось бы сделать сортировку по выбору, но по полю из таблицы объектов, например, цене.

Если искать объект по слову в БД, то используем две таблицы и запрос примерно такой

Select *From tab_words tw, tab_obj_word tow where tw.id_word=tow.id_word and word like '%phrase%'

Если использовать сортировку, то уже третья таблица включается

Select *From tab_words tw, tab_obj_word tow, tab_objects to where tw.id_word=tow.id_word and word like '%phrase%' and to.id_obj=tow.id_obj order by price DESC

Если в базе немного данных, то поиск быстрый, а если несколько десятков тысяч объектов и у каждого около 10 слов, то поиск с сортировкой работает очень долго.

Как сделать правильно?

Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )
AlexVenga
На сайте с 10.04.2007
Offline
190
#1

ИНдекс по словам - гуд, но использовать такую вещь надо тока если поиск. запрос из 1 слова....

Также, слова должны быть в инфинитивах! Это важно! Руский язык многообразен.)

Антикризисное предложение: [Бурж, AdSense] [NEW] Сайты - каталоги компаний с гарантией трафа [Дорого] (/ru/forum/1006462)
N
На сайте с 06.05.2007
Offline
419
#2
humbert:
Как сделать правильно?

что значит правильно? если ты делаешь для себя, то правила задаешь ты сам.

попробуй sphinx search. там довольно серьезно все проработано и со скоростью и со словоформами. однако он сложнее в эксплуатации и поэтому не каждому сайту подойдет.

Кнопка вызова админа ()
humbert
На сайте с 16.03.2006
Offline
536
#3

Почему по одному слову? Можно же like '%фраза1%' or like '%фраза1%'

humbert добавил 22.09.2011 в 12:30

netwind:
что значит правильно? если ты делаешь для себя, то правила задаешь ты сам.

Чтобы поиск по БД не тормозил, если сделать индекс базы слов, то поиск быстрее будет.

[umka]
На сайте с 25.05.2008
Offline
456
#4

А штатный полнотекстовый поиск чем не устраивает?

Лог в помощь!
humbert
На сайте с 16.03.2006
Offline
536
#5

Что значит штатный?

[umka]
На сайте с 25.05.2008
Offline
456
#6
humbert:
Что значит штатный?

Ну вот этот который

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

У меня на нескольких сайтах очень шустро ищет по гигабайтовым таблицам.

humbert
На сайте с 16.03.2006
Offline
536
#7

[umka], спасибо, интересно. Я самоучка, отсюда и пробелы в знаниях.

По части слова оно ищет?

[umka]
На сайте с 25.05.2008
Offline
456
#8
humbert:
[umka], спасибо, интересно. Я самоучка, отсюда и пробелы в знаниях.

По части слова оно ищет?

Ищет, если используется boolean mode:

http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

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

Вообще, если у вас основная задача — это поиск, то посмотрите ещё в сторону PostgreSQL. Там есть встроенный русский поиск с морфологией.

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#9
humbert:
[umka], спасибо, интересно. Я самоучка, отсюда и пробелы в знаниях.

По части слова оно ищет?

Не ищет.

10 частей слова

humbert
На сайте с 16.03.2006
Offline
536
#10

Ищет, только если эта часть слова с начала слова идет.

Это плохо.

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий