[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Посоветуйте насчет поиска
Ausar
Привет всем.

Есть база содержащая тексты статей. Хочу сделать по ней полнотекстовый поиск.
Почитав инфо отсновился на FULLTEXT создал индекс поиск вроде работает возвращает результаты. Но для текста это не совсем то. К примеру слово может встречаться в различных контекстах поэтому очень хочу сделать так чтобы после ссылки на саму статью выводился также и фрагмент текста который содержит искомое слово. Т.е как бы на подобие google где по фрагментам текста можно понять стоит заходить на сайт или нет.
Помогите пожалуйста можно кодом можно советом или пояснением как это можно сделать



Спустя 19 минут, 2 секунды (7.04.2010 - 10:01) Oyeme написал(а):
Тебе придёться спомощю оператора Like %word% искать, слово .

Слово найденно.Запрос возращяет стороку и работаешь со строкой,строку тебе придёться уже разбивать ,зависет всё от условия ,как ты хочешь что бы она показывалась.

Например разбить стороку до "Точки"
Выходит массив предложения.
В массиве ищешь слово например функицией strpos(). wink.gif

Спустя 21 минута, 44 секунды (7.04.2010 - 10:22) vagrand написал(а):
Юзай sphinx http://sphinxsearch.com/

Спустя 4 часа, 38 секунд (7.04.2010 - 14:23) Ausar написал(а):
Нет сфинкс исключен

Насчет LIke можно ли его использовать вообще вместо FULLTEXT насколько это будет накладно для сервера?

Спустя 16 минут, 40 секунд (7.04.2010 - 14:40) vagrand написал(а):
Цитата
Насчет LIke можно ли его использовать вообще вместо FULLTEXT насколько это будет накладно для сервера?


Что like что FULLTEXT уже на средних объемах таблицы, покладет твой MySQL сервер на лопатки. Тока like сделает это немного быстрее чем FULLTEXT

Спустя 28 минут, 3 секунды (7.04.2010 - 15:08) Nikitian написал(а):
Не слушайте про Like. Fulltext на match-against быстрее него, хотя как и всё имеет свои ограничения применимости.
Для выделения снипеттов давно писал функцию, вроде работала вполне корректно:
content_snippet()


/**
* функция выделяет киворды в тексте и возвращает участок текста с кивордами, если они входят в $length
*
@param string $text исходный текст
*
@param array $keywords массив ключей
*
@param string $marktag тег, которым выделять ключевые слова
*
@param int $length примерная длина ожидаемого текста (с учётом целостности слов)
*
@return string
*
@author Nikitian
*/

function content_snippet($text='',$keywords=array(),$marktag='b',$length=200)
{
//mb_internal_encoding('utf-8');//ISO-8859-1 БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
$text=strip_tags($text);
if($text=='' || !is_array($keywords) || sizeof($keywords)==0)return false;//Работать только с корректными данными
if($length==0)return '';//Защита от дурака
//Проверка наличия хоть одного киворда в тексте

$wordshere=array();
$indexes=array();//Индексы, где есть совпадения
foreach($keywords as $key)
{
$index=mb_stripos($text,$key);
if($index!==false)
{
$wordshere[$index][]=$key;
$indexes[]=$index;
while($index!==false)//Это для повторов
{
$index=mb_stripos($text,$key,intval($index)+1);
if($index!==false)
{
$wordshere[$index][]=$key;
$indexes[]=$index;
}
}
}
}

if(sizeof($wordshere)==0)return strlimiter($text,$length);//В тексте нет искомых слов
if(mb_strlen($text)>$length)
{//Если размер текста меньше, чем лимит, то не паримся и выводим сразу всё.
$maxlength=-1;//Максимальное количество вхождений
$maxlengthfrom=-1;//Начальная точка диапазона, где есть эти вхождения.
$max=mb_strlen($text)-$length;
for($i=0;$i<$max;$i++)//Идём по всем возможным диапазонам и смотрим сколько там индексов
{
$count=0;
$maxt=$i+$length;
foreach($indexes as $index)if($index>=$i && $index<=$maxt)$count++;
if($count>$maxlength)
{
$maxlength=$count;
$maxlengthfrom=$i;
}
}

$i=$maxlengthfrom;
if($i!=0)while($text[$i]!='.' && $text[$i]!='!' && $text[$i]!='?' && $i>0)$i--;
$text=mb_substr($text,$i,mb_strlen($text)-$i);
$text=strlimiter($text,$length);
}
//Выделяем попадания
$tag_start='<'.$marktag.'>';
$tag_end='</'.$marktag.'>';
foreach($keywords as $key)$text=preg_replace('|(\S*'.$key.'\S*)|uis',$tag_start.'$1'.$tag_end,$text);
return$text;
}
/**
* Сокращение строки до определённого количества символов без разбития предложений
* не поддерживаются многозначия типа ??? !!! ?! ...
*
@param string $str Исходная строка
*
@param int $min Минимальный размер ожидаемого результата
*
@return <type>
*/
function strlimiter($str,$min)
{
$tstr='';
$flag=false;
$max=strlen($str);
for($i=0;$i<$max;$i++)
{
if($i==$min)$flag=true;
if($flag && ($str[$i]=='.' || $str[$i]=='?' || $str[$i]=='!'))
{
$tstr.=$str[$i];
break;
}
$tstr.=$str[$i];
}
return$tstr;
}


Спустя 13 часов, 26 минут, 55 секунд (8.04.2010 - 04:35) Ausar написал(а):
Спасибо. А можно подробней насчет функции. Насколько я понял сначала нужно провести поиск FULLTEXT затем вызывать функцию для каждого результата подставляя $text и слова которые нужно найти $keywords?

Спустя 5 часов, 41 минута, 27 секунд (8.04.2010 - 10:16) Nikitian написал(а):
Именно так
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.