Релевантный поиск по сайту.

Dimush

Guest
Релевантный поиск по сайту.

Нужно реализовать релевантный поиск по сайту. Сайт работает без базы данных. У каждой страницы, не зависимо от раздела, есть уникальный идентификатор.
Наименования страниц хранятся в папке ./page_names, мета описание страниц хранится в папке ./page_meta, индексы(отфильтрованное текстовое содержание страниц) хранятся в папке ./page_index. Имя файла = его уникальному идентификатору.

По результатам поиска каждая страница получает определенное количество балов в соответствии с которым позиционируется в списке результатов поиска.

Кол-во балов = ([5 балов за совпадение в наименовании] * коэффициент соответствия) + ([5 балов за совпадение в мета описании] * коэффициент соответствия) + ([1 бал * общее кол-во совпадений на странице] * коэффициент соответствия).

Коэффициент соответствия. Так если запрос состоит из трех слов, а соответствие найдено только для 2-х(запрос «крутая гостевая книга», а найдено «гостевая книга»), коэффициент соответствия = 2/3 = 0,6

Собственно говоря как найти если пользователь ищет одно слово понятно… просто ищем. Вопрос в том, как искать фразу что бы учесть частичное или полное совпадение для составления «коэффициента соответствия».

Есть идея искать совпадения для каждого слова в отдельности, запоминать позицию найденного слова в индексном файле, а далее уже работать с полученными массивом(код ниже):

PHP:
<?

//$slolbes - номер столбца
//$word - номер слова
//$search[$word][$stolbes] = либо единице, либо пустой.
//т.е. работаем с таблицей у которой кол-во строк = $word, а кол-во столбцов = $stolbes и далее если находим совпадение, то проверяем по этой таблице равно ли элемент в таблице $word++ и $stolbes++ равно ли ‘1’?
//$p_k - количество найденных слов фразы
//После возвращения из функции, что бы повторно не считать уже найденные слова
//$stolbes = $stolbes + $p_k
//и $word = 0,

function check($stolbes, $word, $p_k, &$search)
	{
	$word++;
	$stolbes++;
	if (isset($search["$word"]["$stolbes"]) and $search["$word"]["$stolbes"] == '1')
		{
		$p_k++;
		$p_k = check($word, $stolbes, $p_k, &$search);
		}
	else
		{
		return $p_k;
		};
	return $p_k;
	};

$rez=0;

/*Пробный запрос*/
$query="навороченная гостевая книга";

/*Обработаем данные получаемые от пользователя*/
$query=strtolower($query);
$mas['word'] = explode(" ", $query);
for ($i=0; $i<count($mas['word']); $i++)
	{
	$mas['word']["$i"]=trim($mas['word']["$i"]);
	}

/*Здесь нужно считать индексный файл, и обработать его(т.е. найти все совпадения и обработать массив)*/
$fmas=file("index.html");
$index=explode(" ", $fmas["0"]);

/*Заполняем массив*/
for ($word = 0; $word < count($mas['word']); $word++)
	{
	for ($stolbes = 0; $stolbes < count($index); $stolbes++)
		{
		if (strstr($index[$stolbes], $mas["word"]["$word"])) $search["$word"]["$stolbes"]='1';
		}
	}

/*А здесь уже обрабатываем полученный массив*/
for ($stolbes = 0; $stolbes < count($index); $stolbes++)
	{
	for ($word=0; $word < count($mas['word']); $word++)
		{
		if (isset($search["$word"]["$stolbes"]) and count($mas["word"]["$word"] > 2))//слова короче трех символов учитываются, как "связующие" но отдельно найденное слово на результат влиять не будет
			{
			$p_k = check($stolbes, $word, 1, &$search);
			$rez = $rez + (1 * ($p_k / count($mas["word"])));
			$stolbes = $stolbes + $p_k;
			$word = 0;
			};
		};
	};

echo '<br>Результат поиска '.$rez;

?>
Это пример для обработки одного индекса. А вообще получается что у меня для каждой страницы нужно будет обработать по три индексных файла(нужно попробовать как это отразиться на скорости(для каждой страницы отдельный файл) и возможно создавать три индексных файла на весь сайт).
Результаты буду записывать в массив $mas[ид_файла][кол-во балов][два слова из индекса до найденного совпадения и два слова после найденного совпадения]. Для постраничного вывода и для кэширования думаю, что нужно организовать отдельную директорию в которой будут в течении некоторого времени хранится файлы с результатами поиска, чье имя будет = md5(фраза_запроса). И соответственно при обработке запроса сначала искать файл в этой директории, и в случае отсутствия искать в индексах и создавать файл записывая в него вышеописанный массив.

Результат получиться примерно такой:
Имя страницы
Мета описание
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…

Что думаете по этому поводу?
 

maxim

Новичок
Если по этому поводу вообще - то лучше хранить в базе.
А если базы нет то на каждый файл создавать 3 файла - не самый лучший вариант.

Тебе может пригодиться статья из последнего пхпинсайда phpinside.ru
 

MiRacLe

просто Чудо
ht//Dig , mnoGoSearch - [m]mnogosearch[/m]
это по поводу поиска
по поводу "думаете" тоже считаю , что накладные расходы (3 файла на каждый "искомый") - очень большие....
 
Сверху