riff
Новичок
Здравствуйте.
Понадобился тут как-то поиск по сайту..., воот. Что для этого нужно: взять готовый инструмент и пользоваться (полнотекстовый индекс, Sphinx, яндекс, ...). Но стало интересно смогу ли самостоятельно написать "подобный инструмент" (в кавычки взято, чтобы не выглядело слишком нагло такое сравнение).
Собственно суть темы - посмотрите, если кому интересно, на мой велосипед, покритикуйте (только совсем уж в порошок не стирайте).
Класс имеет следующую структуру:
Собственно и всё, только заранее прошу прощения за то, обращение к базе написаны не с помощью PDO.
На сайте вся работа с базой данных ведётся через обёртку, выдернуть её не возможно и не нужно, поэтому сделал простенькую заглушку для запросов (класс DB).
Структуру таблиц найдёте в конце файла. Там же есть кое какое дополнительное описание, и тестовый пример.
Управляющие символы в поиске:
"*" - усечение слова (роз* = розетка, розовый, роза, ...). звёздочка может находиться в любой части слова, только имейте ввиду, то сравнение "LIKE" будет проигрывать точному поиску по скорости.
"-" - все слова после минуса - это слова исключения, т.е. в результатах поиска они не должны встречаться.
Ещё раз попрошу прощения, если кого-то взбесит class DB, mysqli_*, не чёткое, возможно описание, и т.п., я постарался оформить, может быть не очень получилось. А ещё могут сказать, что всё это чушь и тогда тратить время на это оформление вообще не имеет смысла.
Код на Pastebin: http://pastebin.com/ZTDM4zXG
Понадобился тут как-то поиск по сайту..., воот. Что для этого нужно: взять готовый инструмент и пользоваться (полнотекстовый индекс, Sphinx, яндекс, ...). Но стало интересно смогу ли самостоятельно написать "подобный инструмент" (в кавычки взято, чтобы не выглядело слишком нагло такое сравнение).
Собственно суть темы - посмотрите, если кому интересно, на мой велосипед, покритикуйте (только совсем уж в порошок не стирайте).
Класс имеет следующую структуру:
PHP:
class ISearch
{
/**
* Добавить страницу к поиску
* @param string $category группа, к которой принадлежит страница
* @param int $page_id id страницы в вашем каталоге
* @param bool $active только активные будут участвовать в поиске
* @param string $title заголовок страницы в поиске
* @param string $path путь к странице в результатах поиска
* @param string $text
* @return bool
*/
public static function add($category, $page_id, $active, $title, $path, $text) {}
/**
* Обновить страницу в поиске
* @param string $category группа, к которой принадлежит страница
* @param int $page_id id страницы в вашем каталоге
* @param bool $active только активные будут участвовать в поиске
* @param string|null $title заголовок страницы в поиске
* @param string|null $path путь к странице в результатах поиска
* @param string $text
* @return bool
*/
public static function update($category, $page_id, $active, $title, $path, $text) {}
/**
* Удалить страницу из поиска
* @param string $category группа, к которой принадлежит страница
* @param int $page_id id страницы в вашем каталоге
* @return bool
*/
public static function delete($category, $page_id) {}
/**
* заполняем таблицу словами близкими по значению
* пример: synonym('подгузник', 'pampers')
* synonym('pampers', 'памперс')
* в данном примере слова 'pampers' и 'памперс' будут приравнены к 'подгузник'
* и в случае поиска по одному из этих трёх слов, страница будет найдена, если в ней
* встречается любое и этих слов.
*
* так же можно добавить слова имеющие приблизительно одинаковое значение
* пример: synonym('телевизор', 'sony') ..ничего другого не придумал
* synonym('конструктор', 'lego')
*
* слова в написанные в транскрипции
* пример: synonym('mercedes', 'мерседес')
*
* слова в различных падежах
* пример: synonym('цветок', 'цветком')
* synonym('цветок', 'цветка')
* synonym('цветок', 'цветах')
* ........
*
* @param string $word
* @param string|null $synonym
* @return bool
*/
public static function synonym($word, $synonym = null) {}
/**
* Работа со стоп-словами
* @param string $word
* @param int $flag STOPWORD_CHECK - проверить принадлежит ли слово к группе стоп-слов,
* STOPWORD_ADD - добавить слово в стоп-словарь,
* STOPWORD_REMOVE - удалить из стоп-словаря
* @return bool
*/
public static function stopword($word, $flag = self::STOPWORD_ADD) {}
/**
* @param string $text поисковый запрос
* @param int $page_num номер выводимой страницы поиска
* @param int $limit кол-во элементов на странице
* @param string $category группа страниц по которым осуществляется поиск
* @return array ['id'=>'', 'active'=>'', 'category_id'=>'', 'page_id'=>'', 'path'=>'', 'title'=>'']
*/
public static function search($text, $page_num = 0, $limit = 25, $category = '*') {}
}
На сайте вся работа с базой данных ведётся через обёртку, выдернуть её не возможно и не нужно, поэтому сделал простенькую заглушку для запросов (класс DB).
Структуру таблиц найдёте в конце файла. Там же есть кое какое дополнительное описание, и тестовый пример.
Управляющие символы в поиске:
"*" - усечение слова (роз* = розетка, розовый, роза, ...). звёздочка может находиться в любой части слова, только имейте ввиду, то сравнение "LIKE" будет проигрывать точному поиску по скорости.
"-" - все слова после минуса - это слова исключения, т.е. в результатах поиска они не должны встречаться.
Ещё раз попрошу прощения, если кого-то взбесит class DB, mysqli_*, не чёткое, возможно описание, и т.п., я постарался оформить, может быть не очень получилось. А ещё могут сказать, что всё это чушь и тогда тратить время на это оформление вообще не имеет смысла.
Код на Pastebin: http://pastebin.com/ZTDM4zXG