[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Три типа поиска...
linf
Облазил много чего по поиску, но решил написать сам, учится то надо же, не факт что лучше, но меня устраивает. Я выделяю три типа поиска, и логика моя такова:

1. Ищем строки содержащую полную поисковую фразу.
2. Ищем строки содержащую ВСЕ! слова из поисковый фразы.
3. Ищем строки, в которых есть любое из слов.

Собственно говоря проблема в том как реализовать второе? (первое и третье уже есть), и вот они:

PHP
$search 'слово+слово';                 //пример поискового запроса.
$search mb_strtolower($search'utf-8');        //заглавные в строчные
$search eregi_replace ('[.?,!()#":;|]'''$search);    //удалили в запросе запятые и другой мусор


//$file - массив от базы индекса по которой производится поиск. 
//база имеет такие строки: 'http://www.site.ru/01.html^# текст текст текст #'


//ПЕРВЫЙ ТИП ПОИСКА!
$search_line str_replace("+"" "$search); //плюс на пробел
for ($q=0$q count($file); $q++)    {
        
$content explode ("^"$file[$q]);
        
$content str_replace("#"""$content);
    if (
mb_substr_count($file[$q], $search_line'utf-8') >= 1)    {
        
$out1[$content[0]][count] = (mb_substr_count($file[$q], $search_line'utf-8') + 100);
        
$out1[$content[0]][link] = $content[0];
    
$text mb_substr($content[1], mb_stripos($content[1], $search_line0'utf-8'), 200'utf-8');
    
$out1[$content[0]][text] = str_ireplace($search_line'<VAR>'.$search_line.'</VAR>'$text);
                                        }
                        }
unset(
$content);


//ТРЕТИЙ ТИП ПОИСКА!
$search_mass explode("+"$search); //из строки поиска делаем массив.
for ($i=0$i count($file); $i++)    {
    for (
$a=0$a count($search_mass); $a++)    {
        
$content explode ("^"$file[$i]);
        
$content str_replace("#"""$content);
    if (
mb_substr_count($file[$i], $search_mass[$a], 'utf-8') >= && false === array_key_exists($content[0], $out1)){
        
$out1[$content[0]][count] = mb_substr_count($file[$i], $search_mass[$a], 'utf-8');
        
$out1[$content[0]][link] = $content[0];
    
$text mb_substr($content[1], mb_stripos($content[1], $search_mass[$a], 0'utf-8'), 200'utf-8');
    
$out1[$content[0]][text] = str_ireplace($search_mass[$a], '<VAR>'.$search_mass[$a].'</VAR>'$text);
                                                              }
                                }
                        }
unset(
$content);






Спустя 20 минут, 5 секунд (8.10.2009 - 17:58) twin написал(а):
Можно разбить строку, в которой идет поиск, в массив по пробелам, то есть по словам. И проверить схождение. Не уверен что это лучший алгоритм, но пока только это на ум взбрело.

Спустя 3 минуты, 10 секунд (8.10.2009 - 18:01) glock18 написал(а):
Разве что так. А вообще что меня напугало - то, что поиск ведет пхп..

Спустя 14 минут, 10 секунд (8.10.2009 - 18:16) kirik написал(а):
Может так?
PHP
$search = 'linf database';
$str = 'Hello! My name is Linf and I hate MySQL database.';
$pattern = str_replace(' ', '.*', preg_quote($search, '/'));
echo preg_match('/'.$pattern.'/ius', $str);


Но вариант который предложили twin и glock18 должен быть быстрее..

Спустя 21 минута, 43 секунды (8.10.2009 - 18:37) linf написал(а):
Цитата (glock18 @ 8.10.2009 - 19:01)
Разве что так. А вообще что меня напугало - то, что поиск ведет пхп..

А чем вести поиск?

Спустя 1 минута, 45 секунд (8.10.2009 - 18:39) linf написал(а):
Цитата (twin @ 8.10.2009 - 18:58)
Можно разбить строку, в которой идет поиск, в массив по пробелам, то есть по словам. И проверить схождение. Не уверен что это лучший алгоритм, но пока только это на ум взбрело.

ну у меня так и сделано, так я ищу любое из слов, а как найти строку в которой есть все слова, но они раскиданы?

Спустя 5 минут, 10 секунд (8.10.2009 - 18:44) glock18 написал(а):
ну ищешь отдельно каждое, пока не натыкаешься на слово, которого нет. если такое нашел - значит нету всех.

искать вообще то по базе.. ну по крайней мере привычней. и быстрее будет, чем файл file/explode и прочим добром парсить...

Спустя 2 часа, 20 минут, 6 секунд (8.10.2009 - 21:04) mokshan написал(а):
формируешь массив из слов запроса, ищешь первое слово в строке, если слово найденно, то в этой строке ищешь следующее, если нашел в строке все слова то заносишь эту строку в массив с результатом...


Спустя 6 дней, 15 часов, 15 минут, 5 секунд (15.10.2009 - 12:19) linf написал(а):
Немного подумал, и все эти три типа поиска, уместил в пять строк, работает быстро. Если кому интересно, алгоритм примерно такой:

Сначала ищу (запрос разбил на слова и через массив циклом) любое из слов, если есть заношу строку в новый массив. Далее, если встречается вся строка, то в [count] прибавляю +1000 если а если слов больше одного, то по +10...

Потом все это сортирую по ревалентности [count], и вывожу =)))

Большое спасибо всем за поддержку, принял к сведению много ценных мыслей!


_____________
Live in new format =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.