URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 1957
[ Назад ]

Исходное сообщение
"Разработка поиска"

Отправлено OZZY , 18-Дек-03 11:00 
Разрабатываю поиск для базы данных.Нужно название строковой функции , которая бы удаляла не нужные символы в запросе , т.е. пользователь ввел искомое слово и случайно нажал на "." или ",".И как она записывается.
И так же нужно чтобы при запросе выводились слова с разными окончаниями , а не строгое соответствие, т.е. ввожу слово аппарат , вывод был аппарат, аппарата, аппараты и т.д.

Содержание

Сообщения в этом обсуждении
"Разработка поиска"
Отправлено Xela , 18-Дек-03 11:20 
>, а не строгое соответствие, т.е. ввожу слово аппарат , вывод
>был аппарат, аппарата, аппараты и т.д.


select * from anything where my_column like '%аппарат%'


"Разработка поиска"
Отправлено OldOwl , 18-Дек-03 12:23 
>Разрабатываю поиск для базы данных.Нужно название строковой функции , которая бы удаляла
>не нужные символы в запросе , т.е. пользователь ввел искомое слово
>и случайно нажал на "." или ",".И как она записывается.
>И так же нужно чтобы при запросе выводились слова с разными окончаниями
>, а не строгое соответствие, т.е. ввожу слово аппарат , вывод
>был аппарат, аппарата, аппараты и т.д.

Корректировать строку поиска лучше в скрипте, формирующем запрос:

PHP:
$search_string = ereg_replace("[\.,]", " ", $search_string);

PERL:
$search_string =~ s/[\.,]/ /g;
(Извиняюсь, была опечатка, вместо =~ написал ~=)

А потом уже:
$query = "select * from my_table where my_column=$search_string%";


"Разработка поиска"
Отправлено OZZY , 18-Дек-03 13:25 
почему-то пишет несоответствие типа: 'ereg_replace'
может я что-то не так делаю qText = ereg_replace("[\.,]", " ", qText)

qText- это запрос получаемый от пользователя.
Для удаления пробелов я использовала qText = Trim(qText)работает замечательно ,так же вычитала информацию что этой же функцией можно и символы удалять, но как правильно записать не знаю .Пишу как разобрано в примере , постоянно ругается, то скобка не там, ставишь ее, потом пишет лишняя, не знаю как быть.Помогите разобраться.

Trim Возвращает строку str со всеми remstr префиксами и/или прибавляет удаленный. Если ни один из спецификаторов BOTH | LEADING | TRAILING не указан, по умолчанию принимается BOTH. Если не определен параметр remstr, то он по умолчанию принимается равным пробелу.select TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar'


"Разработка поиска"
Отправлено OldOwl , 18-Дек-03 19:46 
>почему-то пишет несоответствие типа: 'ereg_replace'
>может я что-то не так делаю qText = ereg_replace("[\.,]", " ", qText)

Вообще-то подразумевается, что qText - это переменная. Поэтому должно быть:
$qText = ereg_replace("[\.,]", " ", $qText);


"Разработка поиска"
Отправлено MEGA , 20-Дек-03 02:47 
>Разрабатываю поиск для базы данных.Нужно название строковой функции , которая бы удаляла
>не нужные символы в запросе , т.е. пользователь ввел искомое слово
>и случайно нажал на "." или ",".И как она записывается.
>И так же нужно чтобы при запросе выводились слова с разными окончаниями
>, а не строгое соответствие, т.е. ввожу слово аппарат , вывод
>был аппарат, аппарата, аппараты и т.д.


$mystr = "strings like '%".ereg_replace(",","%",
         ereg_replace(" ","%' and string like '%",
         ereg_replace(".","%",
         ereg_replace("\!","%",
         ereg_replace("ну и т.д.","%",
         $mystr)))))."%'";

$query = "Select * from searchbase where $mystr";
Вот и все, кстати strings - это столбец, в в котором идет поиск, а searchbase таблица


"Разработка поиска"
Отправлено Zerg WereWolf , 01-Мрт-04 14:26 
regexp + SQL: SELECT * FROM table WHERE match (strfield) against (searchkey)

"Разработка поиска"
Отправлено ACCA , 07-Май-04 21:55 
>И так же нужно чтобы при запросе выводились слова с разными окончаниями
>, а не строгое соответствие, т.е. ввожу слово аппарат , вывод
>был аппарат, аппарата, аппараты и т.д.

В общем случае ты попадаешь на морфологический анализ. Пример - строка поиска содержит "загородка", хочешь ли ты найти "городить"? А "выродки"?

В простейшем случае достаточно алгоритма Портера (поиск/замена по шаблону). Ещё есть такое решение, как N-Grams (триграмы и выше).

Про поиск и про строки - всё нужно преобразовывать в UNICODE. Запрос может придти в CP1251, CP866, KOI8, UTF8.


Ещё замечу, что еврейский парень по имени Сергей Брин собирается получить за программу, которая делает поиск, 2.7182818 зелёных миллиарда. С русской морфологией он пока не заморачивается.