Знаю, что тем было много, но прошелся в поиске почти по всем - нужного не нашел. Мне нужен обычный поиск в 5 таблицах в пределах одной базы. Записей в сумме не особо много, тысяча - максимум, скорее всего. Касаемо самого запроса у меня такие идеи: 1) Если слово одно - то ищем через LIKE 2) Если слов больше - искать через полнотекстовый поиск в логическом режиме Дальше я у меня сомнения. Как правильно осуществить поиск вообще по тексту, если в нем возможно html-теги + как правильно сделать его на всю базу. Со вторым способом у меня такая идея была - просто делать 5 запросов в базу, а потом уже по общей релевантности выдавать результат, но я отказался от него. Да и как быть с html-тегами, не знаю. По поводу первого способа - вообще без понятия, как грамотно осуществить релевантность (правда об этом еще даже и не задумывался, поэтому возможно, что тороплюсь с вопросами). В инете на форуме нашел такую вещь: Эта вещица интересная. Мне кажется, что для меня вариант вполне подходящий, потому что: 1) У меня не много записей => база распухнет, но не сильно. Хотя я читал, что от FULLTEXT она тоже распухает. Поэтому увеличение базы в размере может быть одинаковым (?) 2) Все можно сделать одним запросом 3) Быстродействие поиска (?) 4) Более правильные результаты. Скажите правильный ли подход я планирую (с использованием подсказки с форума)? И как выявить релевантность при использовании LIKE? И самый главный вопрос - как вы устраиваете поиск?
Kreker Мне fulltext не понравился что-то. Не время выполнения, а именно его отоброжение результатов... Использую LIKE.
Elkaz А структуру поиска как грамотнее реализовать? Как человек с форума написал? По-моему, лучший вариант, учитывая, что поиск будет осуществляться только по статьям, добавляемыми админом. Ну а если другой вариант, например - форум?)) Только не говорите: "смотри код" )))
Kreker Как грамотнее - это не ко мне Просто скорее лучше искать по названию. Тут LIKE вполне справляется. А если уже внутри статьи (TEXT) - придется или FULLTEXT придумывать. Или можно еще организовать что-то вроде тегов для определенной статьи и искать по тегам
В общем делаю так, как все задумал, но тут же в ступоре оказался =\ Создал таблицу, где `title` & `text` FULLTEXT, поместил туда текст, вот отрывок: Вот кусочек PHP (не удивляйтесь некоторым вещам, так надо, да на отсутствие необъявленых переменных тоже не обращайте внимание, там много незначимого кода для их определения): PHP: <?php if ($symbols <= 5) { $query = 'SELECT * FROM `search` WHERE '.$where.' '.$ssection.$sort.$limit; $result = $mysqli -> query($query) or mysqdie($mysqli->errno.'@'.$mysqli->error, $_POST["section"]); $mtxt .= $query; } else if ($symbols > 5) { $query ='SELECT * FROM `search` WHERE '.$ssection.' MATCH('.$where.') AGAINST("'.$mysqli -> real_escape_string($word).'" IN BOOLEAN MODE)'.$sort.$limit; $result = $mysqli -> query($query) or mysqdie($mysqli->errno.'@'.$mysqli->error, $_POST["section"]); $mtxt .= $query; } else { die($ptitle.'&&&strtitle2='.$ntitle.'&&&strtitle2='.$mtxt.'Пустой запрос'); } if ($result->num_rows > 0) { $mtxt .= '<pre>'; function sdsdsd($buffer) { global $mtxt ; $mtxt .= $buffer; } $printer = ""; while ($row = $result -> fetch_array(MYSQLI_ASSOC)) { ob_start("sdsdsd"); print_r($row); ob_end_flush(); } $mtxt .= '</pre>'; } ?> Если ввожу wallow, то выполняется полнотекстовый поиск, скрипт выдает : + результат запроса (выводит массив из базы (с текстом, где найдено слово)). Если ввожу wall, то должен искаться по шаблону LIKE, скрипт выдает: И все! Что за баг? Почему не выдает результата в случае LIKE?
Лайк используется в словах от 3х до 5 символов. 3 полнотекстовый не поддерживает, а когда мало символов не советуют вроде бы его использовать. Следующее на чем я заступорился - как определить в том же запросе и кол-во результатов? Склоняюсь к вложенным запросам...
ерунда, имхо, если у тебя все слова проиндексированы самостоятельно, то ты можешь индексировать хоть запятые. А искать LIKE'ом во всех строках - это уже дорогая операция. Гораздо быстрее найти точное соответствие оператором "=" в индексной таблице. Создай пожалуйста базу в 1 млн строк, каждая по 50 кб, и попробуй LIKE. Я не уверен что результат тебе понравится ( хотя грешным делом надо бы почитать как mysql оптимизирует LIKE заросы ) Другое дело таблица с индексами: у тебя будет 30-50 тыс. проиндексированных слов, там уже можно и лайком
ЕМНИП Для LIKE индекс будет использоваться только для шаблона вида Код (Text): aaa% Тоесть первые символы из строки.
Два раза выполняется поиск? =\ Или mysql сохранит результат предыдущего запроса? Да и вообще, для подсчета всех результатов надо будет искать по всей базе... Хотя я читал, что с лимитом тоже сначала ищется полностью выполняется запрос, а потом лимит его разбивает. :? topas У меня текст + тайтлы, причем тайтлы на 80% от всех строк будут пустыми =)
Первый запрос ищет до тех пор, пока результатов не наберется сколько нужно. Второй запрос ищет пока все не переберет и считает результаты. Вот это мне кажется не оптимальным. В идеале хотелось бы, чтобы перебирало все, считало результаты и отбирало часть необходимых. И все это одним запросом.
ну если у тебя не будет выборка на 90% от общего числа. count(*) хорошо оптимизирован по скорости. Он просто подсчитывает количество, не выбирая их и работает заметно быстрее выборки. Кроме того, запрос с count(*) часто можно упростить и ускорить.
Kreker Я, наверное тупой... Или мы говорим о разных вещах Таблица с индексами: id name varchar(20) count int Таблица с текстом: id text text Таблица соответствий index_id text_id count weight (если хотите)