Показать полную графическую версию : Поиск статей по тексту и заголовкам в MySQL
Plutonium 239
12-02-2006, 13:24
Нужно сделать поиск статей. В таблице MySQL два столбца: item_name - заголовок статьи и item_text - текст статьи. Нужно сделать поиск статей по этим полям. У меня какой-то бред получается и ума не приложу как это все сортировать как поисковыки обычно сортируют, типа где больше слов найдено то будет выше.
Вот, что у меня получилось:
$search = explode(' ', $search_line, 3); // разделяем поисковый запрос на отдельные слова
$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($result, MYSQL_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
Переделал запрос
$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";
вроде теперь получше стало.
Но как сделать, чтобы выводилось несколько предложений с найдеными словами, как в поисковиках?
У мнея получилось только
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
Если абстрагироваться от кода, то можно выводить из текста найденных строк таблицы 5-6 слов вокруг найденной строки поиска отделяя такие участки друг от друга многоточиями. Причем ограничивать по длине итоговую строку, чтобы результат не был на полстраницы.
Plutonium 239
14-02-2006, 15:23
Если абстрагироваться от кода, то можно выводить из текста найденных строк таблицы 5-6 слов вокруг найденной строки поиска отделяя такие участки друг от друга многоточиями. Причем ограничивать по длине итоговую строку, чтобы результат не был на полстраницы.
А вот как бы это в коде сделать?
Prisoner
14-02-2006, 18:46
Рабочий день к концу подошел, постараюсь завтра чего-нибудь изобразить.
Plutonium 239
15-02-2006, 18:38
У меня вот чего получилось:
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
У меня получилось нечто иное. Доработать, конечно придется ;). Но наброски я на досуге сделал.
Функция вызывается относительно одного слова, что плохо в общем-то. Когда мы "слайсим" массив исходного текста (вырезаем участок слов), можно еще проверять имеют ли последний вырезанный участок и предпоследний - пересечения (array_intersect), если да, то объединять (имплодить их) не символом многоточия, а пробелом. Ну и так далее. Сорри, ничего из-за спешки более дельного изобратить не смог.
Plutonium 239
16-02-2006, 18:16
если често, то ничего не понял, можно с подробными коментариями, я в этом деле еще чайник:mellow: причем полный...
Тоесть мало найти совпадения в базе данных. Нужно еще вывести результаты поиска в удобной пользователю форме:
Повыделять найденный слова в пределах +- 50 символов, если есть пересечения обьеденить их.
Подсчитать количество совпадений и в зависимости от этого сортировать найденное.
Использовать словарь для грамматического (максимально точного поиска)
Ну и еще много чего другого можно придумать...
Plutonium 239
17-02-2006, 17:15
Решил пока остановиться на последнем своем варианте, ишет и ладно...
Ну и еще много чего другого можно придумать...
Это можно и потом доделать.
Кто знает, пожалуйста, высказывайте свои предложения по этой теме.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.