Создание функции связанных ссылок на основе тегов с использованием PHP и MySQL - PullRequest
2 голосов
/ 09 января 2012

Я занимаюсь разработкой системы на основе PHP, в которой пользователи могут создавать, публиковать и просматривать фрагменты контента с использованием базы данных MySQL, причем каждый фрагмент контента хранится в строке таблицы.Когда пользователь публикует контент, PHP-скрипт извлекает общие слова или теги (удаляя любые стоп-слова, такие как «и» и «или»), упорядочивает их по вхождению и сохраняет их как массив в базе данных.

Помимо просмотра каждого фрагмента контента и сгенерированных тегов, мне нужна функция, которая отображает список опубликованных фрагментов контента, имеющих один или несколько тегов, которые имеет отображаемый контент (аналогично YouTubeпохожие видео или похожие истории на новостных сайтах).Кроме того, я бы хотел, чтобы список упорядочивался в зависимости от того, сколько из этих тегов есть у каждого фрагмента контента.

Я провел небольшое исследование и разработал два разных сценария, которые могут выбирать строки из базы данных на основена наличие каких-либо тегов или нет.Однако оба сценария имеют проблемы:

Первым, что я попробовал, был запрос LIKE;

$tags=$row['tags'];
$tags2=explode(",",$tags);
foreach ($tags2 as $key => $keyword) {
    $sql = ("SELECT DISTINCT * FROM table WHERE tags LIKE '%$keyword%' ");
    if ($key != (sizeof($tags2)-1)){ 
        $sql .= " OR "; 
    }
    $sql .= " LIMIT 20";
}

Проблема этого запроса в том, что он не упорядочивает результаты.Затем я попытался выполнить запрос MATCH AGAINST;

$tags=$row['tags'];
$tags2=explode(",",$tags);
$searchstring="";
foreach ($tags2 as $word){
    $searchstring = $searchstring .' +'.$word;
}
$sql = ("SELECT * FROM table WHERE MATCH (tags) AGAINST ('$searchstring' IN BOOLEAN MODE)");

Хотя результаты упорядочены по релевантности, он извлекает только строку, в которой присутствуют все теги, и если в этой строке отсутствует хотя бы один тег, это не так.получено по запросу.

Мне нужно объединить лучшее из обеих функций, выбрать строки, содержащие один или несколько тегов, а затем упорядочить их по количеству присутствующих тегов.Например;если строка 1 содержит 10 тегов, строка 2 содержит 20 тегов, причем 9 находится в строке 1, а строка 3 содержит 50 тегов, где 8 находится в строке 1, тогда будут извлечены как строка 2, так и строка 3, причем строка 2 будет более релевантной, чем строка 3.

Любая помощь будет оценена

1 Ответ

2 голосов
/ 09 января 2012

Включение символа + в ваш $searchstring заставляет присутствовать все теги. Если вы введете только слова и пропустите +, движок оценит свои результаты без необходимости присутствия каждого слова.

Посмотрите документы для полнотекстового поиска в MySQL .

У вас есть много вариантов с каждым словом. + заставит слово найти где-то в результате, - заставит слово не найти нигде в результате, ~ позволит найти слово, но понизит рейтинг результата, если оно будет найдено. , Прочитайте документы, они очень полезны.

...