Я занимаюсь разработкой системы на основе 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.
Любая помощь будет оценена