Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Поиск статей по тексту и заголовкам в MySQL (http://forum.oszone.net/showthread.php?t=61039)

Plutonium 239 12-02-2006 13:24 405734

Поиск статей по тексту и заголовкам в MySQL
 
Нужно сделать поиск статей. В таблице MySQL два столбца: item_name - заголовок статьи и item_text - текст статьи. Нужно сделать поиск статей по этим полям. У меня какой-то бред получается и ума не приложу как это все сортировать как поисковыки обычно сортируют, типа где больше слов найдено то будет выше.
Вот, что у меня получилось:
PHP код:

$search explode(' '$search_line3); // разделяем поисковый запрос на отдельные слова
$num_s count($search);
for (
$i=0$i<$num_s$i++) // формирование поискового запроса к базе данных
{
if (
$i)
{
$string $string $x " item_name like '%" $search[$i] . "%' or item_text like '%" $search[$i] . "%' ";
}
else
{
$string .= "item_name like '%" $search[$i] . "%' or item_text like '%" $search[$i] . "%' ";
}
}
$query "select *
                from item_text, item_topic
                where item_text.itopic_id = item_topic.itopic_id 
                and ($string)
                limit $in, $s_col"
;
        
$result mysql_query($query$db) or die ("Query failed : " mysql_error());
while (
$row mysql_fetch_array($resultMYSQL_ASSOC)) // Форматирование результатов поиска
{
echo 
"<tr><td><a class=\"search\" href=\"items/item.php?item=" stripslashes($row['item_id']) . "\">" stripslashes($row['item_name']) . "</a></td></tr>";


у мненя такое чувство, что я все неправильно делаю:(

Plutonium 239 13-02-2006 15:19 406118

Переделал запрос
PHP код:

$query "select item_id, item_topic.itopic_id, itopic_name, item_name, item_date, item_author, item_author_mail, item_text,
        match(item_name, item_text) against ('$search_line') as rel
        from item_text, item_topic
        where item_text.itopic_id = item_topic.itopic_id 
        and ($string)
        order by rel desc
        limit $in, $s_col"


вроде теперь получше стало.
Но как сделать, чтобы выводилось несколько предложений с найдеными словами, как в поисковиках?
У мнея получилось только
PHP код:

echo str_replace($search[$i], ('<b>' $search[$i] . '</b>'), substr($row['item_text'], (strpos($row['item_text'], $search[$i]) - 100),200)); 


Prisoner 14-02-2006 10:45 406315

Если абстрагироваться от кода, то можно выводить из текста найденных строк таблицы 5-6 слов вокруг найденной строки поиска отделяя такие участки друг от друга многоточиями. Причем ограничивать по длине итоговую строку, чтобы результат не был на полстраницы.

Plutonium 239 14-02-2006 15:23 406414

Цитата:

Если абстрагироваться от кода, то можно выводить из текста найденных строк таблицы 5-6 слов вокруг найденной строки поиска отделяя такие участки друг от друга многоточиями. Причем ограничивать по длине итоговую строку, чтобы результат не был на полстраницы.
А вот как бы это в коде сделать?

Prisoner 14-02-2006 18:46 406484

Рабочий день к концу подошел, постараюсь завтра чего-нибудь изобразить.

Plutonium 239 15-02-2006 18:38 406942

У меня вот чего получилось:
PHP код:

if (strstr($row['item_text'], $search_line))
{
    
$a str_replace($search_line, ('<b>' $search_line '</b>'), substr($row['item_text'], (strpos($row['item_text'], $search_line) - 150),300));
    echo 
'...' substr($a, (strpos($a' ') + 1), ((strrpos($a' ') + 1) - (strpos($a' ') + 1))) . '...';
}
else
{
    for (
$i=0$i<$num_s$i++)
    {
        if (
strpos($row['item_text'], $search[$i]) === false) continue;
        
$a str_replace($search[$i], ('<b>' $search[$i] . '</b>'), substr($row['item_text'], (strpos($row['item_text'], $search[$i]) - 150),300));
        echo 
'...' substr($a, (strpos($a' ') + 1), ((strrpos($a' ') + 1) - (strpos($a' ') + 1))) . '...<br>';
    }


Вроде работает, но все равно как-то не так:beta::unsure:

Prisoner 16-02-2006 15:01 407241

Вложений: 1
У меня получилось нечто иное. Доработать, конечно придется ;). Но наброски я на досуге сделал.
Функция вызывается относительно одного слова, что плохо в общем-то. Когда мы "слайсим" массив исходного текста (вырезаем участок слов), можно еще проверять имеют ли последний вырезанный участок и предпоследний - пересечения (array_intersect), если да, то объединять (имплодить их) не символом многоточия, а пробелом. Ну и так далее. Сорри, ничего из-за спешки более дельного изобратить не смог.

Plutonium 239 16-02-2006 18:16 407310

если често, то ничего не понял, можно с подробными коментариями, я в этом деле еще чайник:mellow: причем полный...

benya 16-02-2006 19:25 407336

Тоесть мало найти совпадения в базе данных. Нужно еще вывести результаты поиска в удобной пользователю форме:
Повыделять найденный слова в пределах +- 50 символов, если есть пересечения обьеденить их.
Подсчитать количество совпадений и в зависимости от этого сортировать найденное.
Использовать словарь для грамматического (максимально точного поиска)
Ну и еще много чего другого можно придумать...

Plutonium 239 17-02-2006 17:15 407700

Решил пока остановиться на последнем своем варианте, ишет и ладно...
Цитата:

Ну и еще много чего другого можно придумать...
Это можно и потом доделать.
Кто знает, пожалуйста, высказывайте свои предложения по этой теме.


Время: 21:09.

Время: 21:09.
© OSzone.net 2001-