Как можно организовать поиск по базе данных, по всем ее таблицам? Вот я хочу найти не одно слово, а несколько слов и чтоб они не рядом друг с другом были (ну, парочка слов может рядом находиться). Одно слово найти - дело плевое. А вот как фразу искать?
Допустим, в поле есть запись: "Материнская плата ASUS A7V-E производства Сингапур была сделана специально для процессоров AMD". Теперь я хочу найти фразу: "Плата ASUS для AMD". И он мне должен найти что-то, показать в виде ссылки на тот самый товар (ASUS A7V-E).
Я начал думать над этим. Сначала решил сделать эту фразу массивом. Но потом не получилось. Далее я решил ее разбить на отдельные слова. На этом пока остановился.
У кого какие идеи по этому поводу?
Спустя 12 часов, 35 минут, 29 секунд (30.05.2006 - 20:35) Timok написал(а):
тут регулярные, я в них не силен, но может разделить искомую фразу на отдельные слова и искать поочередно каждое, потом раскладывать результаты в порядке уменьшения количества соответствий...
Спустя 13 часов, 14 минут, 59 секунд (31.05.2006 - 09:50) Ithilion написал(а):
Хм... Мне кажется стоит тут регулярные выражения использвать... Например будете строго искать фразу "Плата ASUS для AMD", то можно с помощью комманды explode() её на слова отдельные разбить, а потом регулярное составить:
$search = "Плата ASUS для AMD";
$search_string = "Материнская плата ASUS A7V-E производства Сингапур была сделана специально для процессоров AMD";
$words = explode(" ", $search);
$regular = ".*";
for($i = 0; $i <= sizeof($words)-1; $i++)
{
$regular .= "($words[$i]).*";
}
print eregi($regular, $search_string);// выведет 1 - если найдено
?>
Просматриваете всю базу и в каждой строке ищете таким образом нужное...
CODE
$search = "Плата ASUS для AMD";
$search_string = "Материнская плата ASUS A7V-E производства Сингапур была сделана специально для процессоров AMD";
$words = explode(" ", $search);
$regular = ".*";
for($i = 0; $i <= sizeof($words)-1; $i++)
{
$regular .= "($words[$i]).*";
}
print eregi($regular, $search_string);// выведет 1 - если найдено
?>
Просматриваете всю базу и в каждой строке ищете таким образом нужное...
Спустя 22 часа, 59 минут (1.06.2006 - 08:49) Nigga написал(а):
И что с этоим "1" делать потом? Я не совсем понял про эти регуляры... Можно немного подробней обо всем об этом?
Я, кстати, так и сделал. Но результаты не сильно впечатляют. Он ищет в строке любое совпадение слова. Даже, если оно будет в слове (ищу "мат" находит "материнская").
QUOTE
может разделить искомую фразу на отдельные слова и искать поочередно каждое
Я, кстати, так и сделал. Но результаты не сильно впечатляют. Он ищет в строке любое совпадение слова. Даже, если оно будет в слове (ищу "мат" находит "материнская").
Спустя 1 час, 53 минуты, 56 секунд (1.06.2006 - 10:43) Timok написал(а):
а ты ищи такую строку "ПРОБЕЛматПРОБЕЛ":)
Спустя 2 часа, 40 минут, 20 секунд (1.06.2006 - 13:23) Nigga написал(а):
А, чета не догнал... Можно попробовать. Так, Ithilion, как насчет той единицы?
Спустя 8 часов, 5 минут, 37 секунд (1.06.2006 - 21:29) Ithilion написал(а):
QUOTE(Nigga)
...как насчет той единицы?
Ну уж что с той единицей делать, решать вам...
Если, например, БД представляет что-нибудь вроде:
ID | Name | Description | Price
--------------------------------------------------------------------------------------------------------------------------
58674| ASUS A7V-E | Материнская плата ASUS A7V-E производства Сингапур... | $nnn
Просматриваем всю таблицу... И вдруг при поиске функция возвращает нам "1", и наткнулись мы как раз на "плата ASUS A7V-E", смотрим на первую колонку и делаем ссылку типа
CODE
, где $id получаем из SQL запроса
CODE
SELECT `ID` FROM shop WHERE `Name` = $name
...
Можно так же сохранить строки, в которых было найдено искомое в отдельный массив, и потом извлекать данные уже по ним, чтобы ускорить процесс: ereg (string шаблон, string строка [, array совпадения])
...
Или я не понял, чего вы хотите?..
Спустя 19 минут, 12 секунд (1.06.2006 - 21:48) disc написал(а):
Помоему надо использовать полнотекстоый поиск
Спустя 8 часов, 51 минута, 38 секунд (2.06.2006 - 06:40) Nigga написал(а):
Да, да, Ithilion , вот про это я и спрашивал - че делать с единицей. Теперь понятно. Домой приду - попробую.
disc, ты че имеешь в виду? Если есть идеи - прошу милейше.
Какие еще есть варианты оптимизированного поиска. Может кто в курсе как, например, Яндекс пахает? Я искал в нете - ничего.
disc, ты че имеешь в виду? Если есть идеи - прошу милейше.
Какие еще есть варианты оптимизированного поиска. Может кто в курсе как, например, Яндекс пахает? Я искал в нете - ничего.
Спустя 1 час, 33 минуты, 6 секунд (2.06.2006 - 08:13) Timok написал(а):
QUOTE
Может кто в курсе как, например, Яндекс пахает?
Это врядли знает кто-нибудь, кроме тех кто там работает :) Поиск там и правда очень мощный, в том смысле что их машина отлично разбирается в русском языке, во всяких там подежах и склонениях и т.п. и при этом работает очень быстро.
Спустя 2 часа, 15 минут, 17 секунд (2.06.2006 - 10:28) disc написал(а):
Nigga, почитай вот эту статью http://program.rin.ru/razdel/html/574.html
Спустя 22 часа, 11 минут, 53 секунды (3.06.2006 - 08:40) Nigga написал(а):
А слушай, Ithilion, а не в курсе как сделать результаты выводимые как-то потипу нормальных, т.е. типа как на Яндексе. Ну там, чтоб искомое слово жирненьким было, какая-то выдержка из текста, еще че-нибудь... Ну чтоб понтлявей было.
Спустя 2 часа, 32 минуты, 50 секунд (3.06.2006 - 11:13) Ithilion написал(а):
QUOTE
...почитай вот эту статьюhttp://program.rin.ru/razdel/html/574.html
К сожалению MySQL пока встроенный поиск не поддерживает(вроде как), например, поиск подстроки `чит*` в этом сообщении,т.е. он не найдёт слово "почитай", зато найдёт "читающий"...
Спустя 12 минут, 2 секунды (3.06.2006 - 11:25) Ithilion написал(а):
QUOTE
...как сделать результаты выводимые как-то потипу нормальных...
Ну если вы пользуетесь встроенным поиском MySQL, то результат возвращается в массив, ассоциативный или индексируемый, ведь... Есть, например, структура таблицы как в сообщении #7, тогда выполняем запрос(1):
CODE
$str = 'Плата ASUS для AMD';
$result = mysql_query("SELECT * FROM shop WHERE MATCH (`name`, `description`) AGAINST (('".$str."') IN BOOLEAN MODE)");
$result = mysql_query("SELECT * FROM shop WHERE MATCH (`name`, `description`) AGAINST (('".$str."') IN BOOLEAN MODE)");
Естественно, для работы встроенного поиска, необходимо, чтобы поля, в которых будет вестись этот самый поиск, были проиндексированны, как FULLTEXT, т.е.:
CODE
ALTER TABLE `shop` ADD FULLTEXT(`name`, `description`)
После того, как выполнился запрос (1) начинаем перебирать массив:
CODE
...
Так?..
Спустя 2 дня, 16 минут, 22 секунды (5.06.2006 - 11:41) Nigga написал(а):
QUOTE
поля, в которых будет вестись этот самый поиск, были проиндексированны, как FULLTEXT
Это ты имеешь в виду надо те поля объявить другим типом? Это из-за чего так?
Ithilion, а что за Like такое? Он у меня что-то ищет, а что-то нет...
Надо попробовать. Тока у меня винт *цензура*оду полетел - не определяет при загрузке... Не знаю, када получится попробовать.
Спустя 2 часа, 29 минут, 58 секунд (5.06.2006 - 14:11) Ithilion написал(а):
QUOTE
Это ты имеешь в виду надо те поля объявить другим типом?
Нет, я привёл запрос:
CODE
ALTER TABLE `shop` ADD FULLTEXT(`name`, `description`)
Его достаточно на сервере выполнить, указав нужные поля и таблицу, и он всё сам сделает... FULLTEXT - это такой тип индексирования, а не просто тип ячейки, тип ячейки не меняется...
QUOTE
Он у меня что-то ищет, а что-то нет...
Стандартный поиск MySQL расчитан на большие тескты, и если искомая фраза встречается более чем в 50% ячеек, то ничего возвращено не будет, и ведь действительно зачем искать то, что встречается через каждые две ячейки!?
А чтобы заставить MySQL искать и показывать результат даже при таком случае, то надо перед искомым слово ставить "+".
QUOTE
...а что за Like такое...
Где?
Спустя 37 секунд (5.06.2006 - 14:12) Ithilion написал(а):
QUOTE
...винт *цензура*оду полетел...
S. M. A. R. T. в Bios'е включите и посмотрите, полетел, или нет...
Спустя 18 часов, 48 минут, 31 секунда (6.06.2006 - 09:00) Nigga написал(а):
Т.е. как я понял, этот запрос не меняет типа поля - как был VARCHAR так им и останется?
Про Like это я так спросил. Пробовал просто с ним выбирать. В одном поле ищет, где VARCHAR, а где TEXT - не ищет (не находит по крайней мере).
А, спасиба, Ithilion, у меня *цензура*оду винт просто перегрелся. Надо вентилятор купить срочно! А смарт'а у меня вроде нету. У меня старая мамка - Asus A7V-E.
Про Like это я так спросил. Пробовал просто с ним выбирать. В одном поле ищет, где VARCHAR, а где TEXT - не ищет (не находит по крайней мере).
А, спасиба, Ithilion, у меня *цензура*оду винт просто перегрелся. Надо вентилятор купить срочно! А смарт'а у меня вроде нету. У меня старая мамка - Asus A7V-E.
Спустя 20 минут (6.06.2006 - 09:20) Ithilion написал(а):
QUOTE(Nigga)
...как был VARCHAR так им и останется?
Да, точно, так оно и есть...
Спустя 8 дней, 34 минуты, 56 секунд (14.06.2006 - 09:55) Nigga написал(а):
Эта, может там у меня руки не с того конца.... У меня не получается... :) Сделал я FULLTEXT, а вот запрос твой, Ithilion, не работает. Он у меня на BOOLEAN MODE ругается. Вроде нормально все у меня стоит - php 4.3.0, phpmyadmin с mysql тоже в комплекте шел... Может запрос не такой какой-то... Или я там что-то натворил не того?..
Спустя 4 часа, 37 минут, 35 секунд (14.06.2006 - 14:33) Ithilion написал(а):
QUOTE
...а вот запрос твой, Ithilion, не работает...
Какой именно?.. :)
Спустя 20 часов, 6 минут, 30 секунд (15.06.2006 - 10:40) Nigga написал(а):
Вроде там нигде больше BOOLEAN MODE нету...<br>Вот этот:<br>
$str = 'Плата ASUS для AMD'; $result = mysql_query("SELECT * FROM shop WHERE MATCH (`name`, `description`) AGAINST (('".$str."') IN BOOLEAN MODE)");
Спустя 4 часа, 43 минуты, 40 секунд (15.06.2006 - 15:23) Ithilion написал(а):
Хм, весьма странно, у меня все работает правильно... Не могли бы сказать, какую именно ошибку выдает?<br>Вот, например:<br>
<? mysql_connect("localhost", "root"); mysql_select_db("fantasy"); $str = 'Плата ASUS для AMD'; $result = mysql_query("SELECT * FROM shop WHERE MATCH (`name`, `description`) AGAINST (('".$str."') IN BOOLEAN MODE)"); $result = mysql_fetch_array($result); print $result[0]; ?>
Спустя 17 часов, 33 минуты, 48 секунд (16.06.2006 - 08:57) Nigga написал(а):
Ну не знаю... Еще раз попробую. А насчет ошибки, так он просто говорит Error и пишет последний кусок запроса, т.е. примерно этот:
Дословно щас не скажу, я не дома. Но запрос определенно не хочет выполнять.
Кстати говоря... Как мне сделать так, чтоб он первой выводил ссылку ту, которая ближе по смыслу к тексту запроса?
QUOTE
IN BOOLEAN MODE)
Дословно щас не скажу, я не дома. Но запрос определенно не хочет выполнять.
Кстати говоря... Как мне сделать так, чтоб он первой выводил ссылку ту, которая ближе по смыслу к тексту запроса?
Спустя 3 часа, 45 минут, 36 секунд (16.06.2006 - 12:43) Ithilion написал(а):
QUOTE
Кстати говоря... Как мне сделать так, чтоб он первой выводил ссылку ту, которая ближе по смыслу к тексту запроса?
Встроенный поиск автоматически сортирует результат по величине релевантности...
Спустя 19 часов, 25 минут, 19 секунд (17.06.2006 - 08:08) Nigga написал(а):
Встроенный - это тот, что Like %bla% ???
Спустя 1 день, 2 часа, 47 минут, 28 секунд (18.06.2006 - 10:55) Ithilion написал(а):
QUOTE(Nigga)
Встроенный - это тот, что Like %bla% ???
Который IN BOOLEAN MODE... :)
Кстати, IN BOOLEAN MODE означает дополнительные опции, можно обойтись и без него, но тогда если искомое будет встречатсья более чем в 50% всей информации, то поиск не возвратит ничего.. Или я это уже говорил?...
Спустя 1 день, 41 минута, 29 секунд (19.06.2006 - 11:37) Nigga написал(а):
Вроде говорил. А может я где-то слыхал...
Я уже сколько всремени бьюсь и ничего не могу путного придумать... Сделал одну вещь, но... Короче, если ищещь одно слово - вроде нормально результаты выдает, но не сортирует по близости к запросу. А вот если запрашиваешь больше слов, то получается фигня. Но я над этим еще поработаю.
С поиском по БД я так ничего и не понял... Пытаюсь... Может мне подсказали здесь про BOOLEAN MODE не совсем верный запрос?
Я уже сколько всремени бьюсь и ничего не могу путного придумать... Сделал одну вещь, но... Короче, если ищещь одно слово - вроде нормально результаты выдает, но не сортирует по близости к запросу. А вот если запрашиваешь больше слов, то получается фигня. Но я над этим еще поработаю.
С поиском по БД я так ничего и не понял... Пытаюсь... Может мне подсказали здесь про BOOLEAN MODE не совсем верный запрос?
Спустя 1 день, 7 часов, 35 минут, 46 секунд (20.06.2006 - 19:13) Ithilion написал(а):
Хм, смотря что вы подразумеваете под термином "близости к запросу", встроенный поиск сортирует по величине релевантности, т.е. на основе количества слов в данной строке столбца, количества уникальных слов в этой строке... Может в этом вся загвоздка? А при поиске нескольких слов обязательно нужно IN BOOLEAN MODE, там ещё особые опции есть...
Спустя 2 минуты, 21 секунда (20.06.2006 - 19:15) Ithilion написал(а):
И вообще что-то никак это обсуждение с мертвой точки не двигается, давайте, изложите все проблемы конкретно(можно даже с примерами :) ) Там и посмотрим!
Спустя 15 дней, 19 часов, 28 минут (6.07.2006 - 14:43) Nigga написал(а):
Пример? Вот тебе ответ базы. Может ты там что увидишь... Сразу говорю - поле, в котором я ищу (opis_tov) в фуллтексте.<br>
<b>Ошибка</b> SQL-запрос : SELECT * FROM tovar WHERE MATCH ( opis_tov ) AGAINST ( ( 'мобил' ) IN BOOLEAN MODE ) ) LIMIT 0, 30 Ответ MySQL: You have an error in your SQL syntax near 'BOOLEAN MODE)) LIMIT 0, 30' at line 1
Спустя 1 месяц, 27 дней, 20 часов, 46 минут, 43 секунды (4.09.2006 - 11:30) Nigga написал(а):
И что? Нет ответа на этот ответ базы? Это, *цензура*оду у меня с базой чета не то? Хотя...
_____________
Just a Real Nigga...