Dimush
Guest
Релевантный поиск по сайту.
Нужно реализовать релевантный поиск по сайту. Сайт работает без базы данных. У каждой страницы, не зависимо от раздела, есть уникальный идентификатор.
Наименования страниц хранятся в папке ./page_names, мета описание страниц хранится в папке ./page_meta, индексы(отфильтрованное текстовое содержание страниц) хранятся в папке ./page_index. Имя файла = его уникальному идентификатору.
По результатам поиска каждая страница получает определенное количество балов в соответствии с которым позиционируется в списке результатов поиска.
Кол-во балов = ([5 балов за совпадение в наименовании] * коэффициент соответствия) + ([5 балов за совпадение в мета описании] * коэффициент соответствия) + ([1 бал * общее кол-во совпадений на странице] * коэффициент соответствия).
Коэффициент соответствия. Так если запрос состоит из трех слов, а соответствие найдено только для 2-х(запрос «крутая гостевая книга», а найдено «гостевая книга»), коэффициент соответствия = 2/3 = 0,6
Собственно говоря как найти если пользователь ищет одно слово понятно… просто ищем. Вопрос в том, как искать фразу что бы учесть частичное или полное совпадение для составления «коэффициента соответствия».
Есть идея искать совпадения для каждого слова в отдельности, запоминать позицию найденного слова в индексном файле, а далее уже работать с полученными массивом(код ниже):
Это пример для обработки одного индекса. А вообще получается что у меня для каждой страницы нужно будет обработать по три индексных файла(нужно попробовать как это отразиться на скорости(для каждой страницы отдельный файл) и возможно создавать три индексных файла на весь сайт).
Результаты буду записывать в массив $mas[ид_файла][кол-во балов][два слова из индекса до найденного совпадения и два слова после найденного совпадения]. Для постраничного вывода и для кэширования думаю, что нужно организовать отдельную директорию в которой будут в течении некоторого времени хранится файлы с результатами поиска, чье имя будет = md5(фраза_запроса). И соответственно при обработке запроса сначала искать файл в этой директории, и в случае отсутствия искать в индексах и создавать файл записывая в него вышеописанный массив.
Результат получиться примерно такой:
Имя страницы
Мета описание
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…
Что думаете по этому поводу?
Нужно реализовать релевантный поиск по сайту. Сайт работает без базы данных. У каждой страницы, не зависимо от раздела, есть уникальный идентификатор.
Наименования страниц хранятся в папке ./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(фраза_запроса). И соответственно при обработке запроса сначала искать файл в этой директории, и в случае отсутствия искать в индексах и создавать файл записывая в него вышеописанный массив.
Результат получиться примерно такой:
Имя страницы
Мета описание
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…
…[+два крайних в индексе слова+]найденная_фраза[+два крайних в индексе слова+]…
Что думаете по этому поводу?