Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярное выражение для поиска, Помогите составить 
:(
    Опции темы
AlexanderI
Дата 19.7.2005, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Делаю скрипт поисковой системы у себя на сайте.
Суть такая:
Например искомое слово: $search = "хорошие мыкароны";
Предложение: $str = "хорошеникие макарончики и приготовлены хорошо";
Обрубаю последние гласные, для более расширенного поиска, получилось "хорош макарон".
Чтобы можно было найти "хорошеникие макарончики" .

Каким образом мне найти предложении $str если искомое словосочетание "хорош макарон" ?

Можно ли это сделать с помощью регулярных выражений и с помощью $str =~ m/$search/isg ?
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 19.7.2005, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Где производится поиск? В файлах, в базе данных? С индексацией?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 19.7.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Цитата(AlexanderI @ 19.7.2005, 21:41)
Можно ли это сделать с помощью регулярных выражений и с помощью $str =~ m/$search/isg

Я думаю можно.

Можно в цикле сделать такую проверку, с каждой итерацией отсекая последнюю букву от слова, например, пока две буквы не останется. И выводить найденное в приоритетном порядке.



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
AlexanderI
Дата 19.7.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Цитата(korob2001 @ 19.7.2005, 21:53)
Где производится поиск? В файлах, в базе данных? С индексацией?

Поиск будет проводится сперва в файлах и потом в базе. Но это мне кажется не так уж важно. Файлы я вытягиваю в одну строчку, и базу тоже. И ищу совпадения сразу в строке, потом в другой. база без индекса вроде.
Добавлено @ 23:58
Цитата(sharq @ 19.7.2005, 22:00)
Я думаю можно.

А как именно это в программном коде расписать ?

Я ниразу поиск не делал, буду рад любой подсказки.

про мой поиск:
Поиск осуществляется по нескольким ключевым словам
Каждое ключевое слово обрабатывается следующим образом: если на конце есть одна или две гласные – то они отбрасываются.

Слова в списке ключевых слов могут быть разделены следующими знаками (где _ пробел):
“_”
“__”
“,_”
“;_”
“._”


Это сообщение отредактировал(а) AlexanderI - 19.7.2005, 23:55
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 20.7.2005, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Пробуй по базе искать SQL запросом, а не Perl'ом, рабоать будет намного быстрее.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 20.7.2005, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



AlexanderI ты хочешь реализовать что-то типа поисковой системы как Google и др. (находить введенное слово или словочетание и выводить url-путь к странице, где содержится введенная фраза) или обыкновенный поиск (найти что-то похожее в файлах или БД и вывести что есть в таком-то файле или таблице).

В общем это два разных подхода при реализации, определись.


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
AlexanderI
Дата 20.7.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Цитата(korob2001 @ 20.7.2005, 03:56)
Пробуй по базе искать SQL запросом, а не Perl'ом, рабоать будет намного быстрее.

это мысль.
Добавлено @ 10:47
Цитата(sharq @ 20.7.2005, 10:41)
В общем это два разных подхода при реализации, определись.


у меня будет поиск на моём сайте. обыкновенный поиск (найти что-то похожее в файлах или БД и вывести что есть в таком-то файле или таблице).

--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
sharq
Дата 20.7.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Тогда тебе придется конструировать запросы автоматически, на основе данных, введенных в форму, и структуры твоих таблиц БД.

Это сообщение отредактировал(а) sharq - 20.7.2005, 12:51


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
AlexanderI
Дата 21.7.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Может тогда подскажите как сформировать запрос $str =~ m/$search/isg таким образом чтобы в строке $str = "хорошеникие макарончики и приготовлены хорошо" нашлась искомая фраза $search = "хорош мыкарон" . С помощью регулярных выражений как-то.
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 21.7.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Примерно так:
Код

# Получили строку
my $search = "строка";
# Обрезаем 3 последних символа, нужно так же разбивать
# строку на подстроки если в ней несколько слов
my $sh = substr($search, 0, -3);
# Строим запрос
my $sql = "SELECT Name, Surname FROM UserInfo WHERE Name LIKE '$sh%' OR Surname LIKE '$sh%' ORDER BY Surname";

А что касается регулярных выражений, то примерно так:
Код

#!/usr/bin/perl -w
use strict;
use locale;

my $str = "хорошеникие макарончики и приготовлены хорошо";
my $search = "хорош мыкарон";
my $sh = qr//;
$sh = join('|',split(/\s+/, $search));

if ( $str =~ /$sh/ ) {
     print "Нашёл";
} else {
     print "Неудача";
}

Естественно здесь всё упрощено. Хотя это не самое наверное и не самое лучшее решение генерировать шаблон таким образом, я в данно случае имел ввиду вот это: |
Хотя оно будет тормозить, если много слов будет в искомой строке.


Это сообщение отредактировал(а) korob2001 - 21.7.2005, 12:47


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
AlexanderI
Дата 21.7.2005, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Цитата(korob2001 @ 21.7.2005, 12:27)
А что касается регулярных выражений, то примерно так:


Этот код хороший. Но он ищет только по одному слову. Если первое слово найдено, то он обязательно скажет "Нашёл". Каким бы образом сделать так чтобы он сказал "Нашёл" когда найдены все слова, и сказал "Неудача" еслибы небыло найдено хотябы одно слово ?
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
AlexanderI
Дата 22.7.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: 2
Всего: 3



Я понял, нужно просто вместо $sh = join('|',split(/\s+/, $search)); написать $sh = join('(.+?)',split(/\s+/, $search));


--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
korob2001
Дата 22.7.2005, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А зачем это делать? Ведь поисковики именно так и ищат, по одному слову. Хотя там алгоритм сложнее, они сначала показывают строгое соответствие, а потом те в которых найдено хотябы одно из слов.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Anarki
Дата 27.7.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



Что я знаю, поисковики используют алгоритм обратного индекса.


--------------------
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.