Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Индексация поиска

Я оптимизировал поиск. Отныне он индексированный.

Индекс представляет из себя динамический многомерный массив следующей структуры:


 слово_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++;
 }
 
Похоже , тут есть что оптимизировать :-)

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье