Индексация поиска
Я оптимизировал поиск. Отныне он индексированный.
Индекс представляет из себя динамический многомерный массив следующей структуры:
слово_N1 , индекс_файла_N1 , частота_N1 , индекс_файла_N2 , частота_N3 , ...
слово_N2 , индекс_файла_N3 , частота_N3 , индекс_файла_N4 , частота_N4 , ...
...
слово_N1 - уникальное слово на весь контент сайта
индекс_файла_N1 - порядковый номер файла в файловом массиве
частота_N3 - число попаданий слова в файле
В нижеследующем скрипте показано, как за один проход происходит сканирование статических файлов,
в которых находится контент сайта, и генерируется индекс, который потом сбрасывается на диск.
И последующий поиск ведется теперь уже не по контенту,который разбросан по множеству файлов,
а по одному-единственному файлу-индексу.
Теперь поиск на сайте состоит из двух видов :
1. с маской ИЛИ , которая установлена по умолчанию
2. с маской И
В первом случае находятся все файлы, в которых находится хотя бы одно слово из набора слов,
заданных в поисковой строке.Результаты выводятся по релевантности.
Во втором случае находятся только те файлы, в которые одновременно входят все слова, входящие в поисковую строку.
Как вы понимаете, второй вариант является частным случаем от первого.
Код,генерирующий индекс :
foreach $sf (@FILES)
{
open(FILE,"$sf");
@LINES = < FILE>;
close(FILE);
$string = join(' ',@LINES);
$string =~ s/\n//g; # выкинем каретку
$string =~ s/<.+?>//gs; # выкинем теги
$string =~ s/[,.=\-\[\]!{}()#%&;:*"'`~\\0?]//g; # выкинем не-буковки
@words = split (/ /, $string); # бьем файл на слова
foreach $massiv3 (@massiv3)
{
$massiv3=0;
}
foreach $word (@words)
{
$found=0;
if ($word =~ m/.{3,}/) # по крайней мере слово не менее 3 символов
{
if(exists $hash{$word}) # есть такая буква -
{
$ii=$hash{$word};
if($massiv3[$ii]!=1)# добавляем в список новую пару : файл - количество
{
$massiv2[$ii]+=1;
$massiv[$ii][$massiv2[$ii]]=$i;
$massiv2[$ii]+=1;
$massiv[$ii][$massiv2[$ii]] =1;
$massiv3[$ii]=1;
}
else # увеличиваем счетчик для данного слова в данном файле
{
$massiv[$ii][$massiv2[$ii]] +=1;
}
}
else # создаем новый массив для нового слова
{
$mc=$massiv_count;
$massiv[$mc][0]=$word;
$massiv[$mc][1]=$i;
$massiv[$mc][2]=1;
$massiv2[$mc]=2; # позиция индекса в строке массива
$massiv3[$mc]=1; # переключатель курсора
%hash = (%hash, $word , $mc);
$massiv_count++; # главный индекс базового массива
}
}
}
$i++;
}
Похоже , тут есть что оптимизировать :-)
|