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

1 23
TF-Studio
На сайте с 17.08.2010
Offline
334
#21

какой-то аноним считает, что sphinx плохо работает, но боится это сказать?

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
palladin_jedi
На сайте с 13.07.2010
Offline
71
#22
humbert:
palladin_jedi, а можно пример такого запроса?

Когда-то реализовывал поиск по базе автозапчастей по нечёткому вхождению артикула:

$parts_ids = implode(", ", $parts_temp);


$parts_query_det="
SELECT
ART_ARTICLE_NR,
SUP_BRAND,
FROM
ARTICLES
WHERE
ART_ID IN (".$parts_ids.")";

$parts_det_select=$db->query($parts_query_det);

Но это уже результирующая функция, там вся загвоздка была в генерируемом паттерне, который генерился из вводимого текста.

humbert:
Как искать по всем встречающимся этим словам, не используя три like?

Гемморойно, поэтому если задача позволяет - пользуйтесь LIKE и не мучайтесь. А если нужно что-то более скоростное - тогда придется долго страдать над кодом. :)

Сайт о web-разработке и прочем (http://seazo.net)||Продвижение статьями под Google (http://short.seazo.net/ght4zf) Бесплатные консультации рефералам Sape (http://www.sape.ru/r.SWfwWOblBo.php) PHP и JS скрипты на заказ, создание сайтов с нуля и на CMS.
humbert
На сайте с 16.03.2006
Offline
532
#23

Спасибо, так я и понял, что варианты геморойные:)

Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )
N
На сайте с 06.05.2007
Offline
419
#24
humbert:
Если я буду искать нужные записи так: "Select *From table" - выберу все строки из БД и в цикле буду просматривать строки и искать нужные. Это правильно?

в некоторых случаях. допустим, если поиск происходит в небольшом словарике из 100 строк, который никогда не растет во время эксплуатации сайта.

Кнопка вызова админа ()
Studioad
На сайте с 03.02.2011
Offline
31
#25

Можно использовать phpmorphy для автоматического создания поискового индекса. Алгоритм примерно такой:

1. базу материалов вяжем с базой индексов этих материалов где каждое слово приведено в инфинитив (библиотекой же) и скажем к верхнему регистру, убраны стоп слова и любые небуквенные знаки.

2. получаем поисковый запрос - приводим в инфинитив.

3. ищем прямым совпадением по поисковому индексу.

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

Бесплатные обои (http://oboi.ws) - они меня кормят
humbert
На сайте с 16.03.2006
Offline
532
#26

Решил я использовать Fulltext, а там непонятное что-то. Ищет быстро, но не все находит

Например, в БД есть записи, содержащие поисковую фразу, например "ах":

Страх[и] темноты
На колесах
Дурдом на колесах
Там, на неведомых дорожках...
Кот в сапогах
О мышах и людях

Но фуллтекст их не видит. Запрос простой

Select *From table where MATCH (string) AGAINST ('+ах*' IN BOOLEAN MODE)
edogs software
На сайте с 15.12.2005
Offline
775
#27
humbert:
MySQL, всегда пользовался обычным Like '%фраза%' для реализации поиска на сайте. Но если база достаточно большая, то like будет работать медленно.

Вопрос - насколько большая база?

Если вдс/сервер свой, то самый простой вариант, это держать базу текстов тупо в памяти. Самое простое в memory table. Искать лайком, индексы не вешать. Даже в жалкие (по нынешним временам) 512 мегабайт влезает 256 тысяч описаний фильмов с хорошим запасом, например (особенно если побить длинные описания на разные строки). Зато вопрос со скоростью поиска решается кардинально и главное - легко. Тупой прямой подход иногда рулит:)

p.s.: Естественно в memory table только дубли для поиска, т.к. мало ли сервер вырубится:) Если длина текста сильно разная, то в связи с тем, что в memory table можно использовать поля только фикс.длины, есть смысл сделать допустим поле в 4кб, если тексты превышают 4кб, то бить на несколько строк - сэкономите чутка памяти. И это, не забудьте - если только русский язык, используйте внутри БД для хранения cp1251 вместо utf8, по памяти и скорости выиграете изрядно.

netwind:
перебор по 512 мб в памяти не такой уж и быстрый. не самая хорошая идея.

Поскольку like '%ах%' индексов не использует, то это в любом случае raw поиск. И тут разница будет между 512Мб диска и 512Мб памяти, а это таки разница. Альтернативные варианты хотя и красивее, по скорости это памятежрущее решение вряд ли побьют.

Есть вариант просто хранить таблицу MyISAM на "временном" диске в памяти, но это более сложное решение, требующее вмешательства админа в том числе.

Тут в соседнем топике о хетзнере спрашивали куда можно 32Гб на одноядерном сервере потратить - дык вот, на поиск, можно и больше:)

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
humbert
На сайте с 16.03.2006
Offline
532
#28

Таблица содержит 34.000 записей весом около 300 мб.

Пошел читать про memory table

N
На сайте с 06.05.2007
Offline
419
#29
humbert:
Например, в БД есть записи, содержащие поисковую фразу, например "ах":

в настройках по умолчанию минимальное индексируемое слово - 4 буквы.

"ах" это не слово, а междометие. при поиске они не нужны.

перебор по 512 мб в памяти не такой уж и быстрый. не самая хорошая идея.

1 23

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