Igor aka TiGR
Новичок
Форматирование результатов поиска aka Google
Поискал по форуму, сайту, FAQ, но ничего не нашёл, а задача ИМХО интересная и сложная. Суть в следующем: производится поиск по объёмистым документам. На страницу выводится, скажем, 10 штук результатов. Запросы соответствуют стандарту MySQL BOOLEAN FULLTEXT, т.е. могут использоваться кавычки, плюсы, минусы, знаки вопроса, звёздочки (поддерживать бы хотя бы это). Выводить полные тексты никто не станет, надо выводить фрагменты (скажем, не более 300 символов), и тут начинается самое интересное:
Если поисковое слово всего одно - всё просто: ищем первое вхождение, и выводим. Можно использовать что-то вроде:
Всё бы ничего, но уже тут начинаются первые проблемы. Если слово находится близко к началу текста, будет выведено не 300 символов, а всего ~170.
Ещё сложнее ситуация, если слов два (и более). Дело в том, что слова могут стоять в произвольном порядке. Если есть место, где они стоят рядом - надо вывести в первую очередь его.
Если слов совсем много (штук пять) - тут вообще дурдом.
Короче, как можно решить данную задачу?
Цель - выводить результат как в Google. Если вводишь пять слов, и на странице есть место где рядом стоят все пять слов - гугл покажет именно его. Более того, если слова находятся группами - три там, два тут - гугл выведет оба этих фрагмента, разделив их многоточием.
Равно как и если запрос состоит из двух слов возможны два варианта:
1. слова стоят в тексте рядом (расстояние меньше чем maxlengh), и можно вывести одним результатом.
2. слова разнесены по тексту. Нужно вывести два фрагмента, суммарной длиной не больше maxlength, в каждом из фрагментов стоит своё слово.
Также, хочется, чтобы это не был метод "грубой силы" - всё таки придётся обрабатывать по десять текстов за раз, а при большом наплыве посетителей это может стать сильно заметно.
Поискал по форуму, сайту, FAQ, но ничего не нашёл, а задача ИМХО интересная и сложная. Суть в следующем: производится поиск по объёмистым документам. На страницу выводится, скажем, 10 штук результатов. Запросы соответствуют стандарту MySQL BOOLEAN FULLTEXT, т.е. могут использоваться кавычки, плюсы, минусы, знаки вопроса, звёздочки (поддерживать бы хотя бы это). Выводить полные тексты никто не станет, надо выводить фрагменты (скажем, не более 300 символов), и тут начинается самое интересное:
Если поисковое слово всего одно - всё просто: ищем первое вхождение, и выводим. Можно использовать что-то вроде:
PHP:
$maxlength = 300;
preg_match("/(^|\W).{0," . $maxlength/2 . "}$searchword{0," . $maxlength/2 . "}(\W|$)/i", $text, $matches);
Ещё сложнее ситуация, если слов два (и более). Дело в том, что слова могут стоять в произвольном порядке. Если есть место, где они стоят рядом - надо вывести в первую очередь его.
Если слов совсем много (штук пять) - тут вообще дурдом.
Короче, как можно решить данную задачу?
Цель - выводить результат как в Google. Если вводишь пять слов, и на странице есть место где рядом стоят все пять слов - гугл покажет именно его. Более того, если слова находятся группами - три там, два тут - гугл выведет оба этих фрагмента, разделив их многоточием.
Равно как и если запрос состоит из двух слов возможны два варианта:
1. слова стоят в тексте рядом (расстояние меньше чем maxlengh), и можно вывести одним результатом.
2. слова разнесены по тексту. Нужно вывести два фрагмента, суммарной длиной не больше maxlength, в каждом из фрагментов стоит своё слово.
Также, хочется, чтобы это не был метод "грубой силы" - всё таки придётся обрабатывать по десять текстов за раз, а при большом наплыве посетителей это может стать сильно заметно.



