Перейти к публикации

Плохо выбираются похожие новости


Рекомендованные сообщения

Заметил, что выборка похожих новостей через тег {related-news} очень и очень далека от идеала. Например в статьях про ДТП выводятся "похожие" новости про ямы на дорогах или концерты. При том, что новости про ДТП почти каждый день попадают на сайт.

 

Как следует из анализа \engine\modules\show.full.php, поиск похожих делается только в момент первого открытия новости, и не перестраивается после, пока не обнулишь поле related_ids (например через "Перестроение кэша похожих новостей") . Поиск похожих новостей делается через:

 SELECT ... MATCH (title, short_story, full_story, xfields)... AGAINST

Как видно, запрос MATCH AGAINST проходит не в boolean режиме (в отличие от полнотекстового поиска). А значит для нормальной работы этого запроса требуется полнотекстовый индекс ( FULLTEXT) у тех полей, по которым проходит поиск. Как видно из структуры БД у указанных полей (title, short_story, full_story, xfields) отсутствует таковой индекс. Его можно добавить самому, но теперь вопрос @celsoft: а это так и должно быть или у меня не обновилась база при обновлении скрипта?  

 

К тому же судя по инструкции нужно еще и сортировать результаты по релевантности (делая два запроса MATCH AGAINST - второй пример по ссылке). У нас же сортировки вообще не наблюдается.

 

Кстати, было бы неплохо делать автоматический сброс кеша похожих новостей хотя бы раз в день (отдельно от настройки "Количество дней, в течение которых кешировать полную новость после ее публикации").

 

 

Ссылка на сообщение
Поделиться на других сайтах
52 минуты назад, YuriBtr сказал:

Как следует из анализа \engine\modules\show.full.php, поиск похожих делается только в момент первого открытия новости, и не перестраивается после, пока не обнулишь поле related_ids (например через "Перестроение кэша похожих новостей") .

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

 

54 минуты назад, YuriBtr сказал:

Как видно, запрос MATCH AGAINST проходит не в boolean режиме

Так и должно быть. Потому как идет поиск по отдельным ключевым словам, а идет сравнение всего текста публикаций.

 

1 час назад, YuriBtr сказал:

Как видно из структуры БД у указанных полей (title, short_story, full_story, xfields) отсутствует таковой индекс. Его можно добавить самому, но теперь вопрос @celsoft: а это так и должно быть или у меня не обновилась база при обновлении скрипта?  

Ошибаетесь. В оригинальной структуре такой индекс есть. В БД составной индекс FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`). Он там всегда был, это не при обновлении добавлялся, он существовал всегда. Если у вас его нет, то создайте его. Возможно вы просто не обращается внимания что это составной индекс, думая, что он у вас только short_story по имени. Посмотрите внимательнее, если его нет, то конечно вам нужно его создать.

 

1 час назад, YuriBtr сказал:

К тому же судя по инструкции нужно еще и сортировать результаты по релевантности (делая два запроса MATCH AGAINST - второй пример по ссылке). У нас же сортировки вообще не наблюдается.

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

 

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, celsoft сказал:

Ошибаетесь. В оригинальной структуре такой индекс есть. В БД составной индекс FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`). Он там всегда был, это не при обновлении добавлялся, он существовал всегда.

Да, прошу прощения, действительно есть, это видно по запросу:

select index_name, group_concat(column_name) as columns
from information_Schema.STATISTICS 
where table_schema = 'your_db_name' 
and table_name = 'dle_post' 
and index_type = 'FULLTEXT'
group by index_name;

Я неправильно смотрел наличие этого индекса в phpMyAdmin.

 

Кстати в \engine\ajax\find_relates.php также есть выборка но с учетом релевантности.

Изменено пользователем YuriBtr
Ссылка на сообщение
Поделиться на других сайтах

Если кому интересно, алгоритм определения похожих новостей удалось заметно улучшить (хотя еще далеко до идеала):

 

В файле engine/modules/show.full.php:

заменить
$body = strip_tags( stripslashes( $metatags['title'] . " " . $body ) );

на
$body = strip_tags( stripslashes( $metatags['title'] . " " . $metatags['keywords'] . " " . $social_tags['news_keywords'] . " " . $body ) );

чуть ниже в этом же файле

заменить
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM " . PREFIX . "_post WHERE {$where_category}{$allowed_cats}{$not_allowed_cats}MATCH (title, short_story, full_story, xfields) AGAINST ('$body') AND id != " . $row['id'] . " AND approve=1" . $where_date . " LIMIT " . $config['related_number'] );

на
$db->query( "SELECT id, date, short_story, xfields, title, category, alt_name, MATCH (title, short_story, full_story, xfields) AGAINST ('$body') as score FROM " . PREFIX . "_post WHERE {$where_category}{$allowed_cats}{$not_allowed_cats} MATCH (title, short_story, full_story, xfields) AGAINST ('$body') AND id != " . $row['id'] . " AND date < NOW() AND approve=1" . $where_date . " ORDER BY score DESC, date DESC LIMIT " . $config['related_number'] );

 

Кстати не нашел где формируется условие $where_date, полагаю что про него забыли. В нем можно прописать ограничение по дате, чтобы не тянуть старые новости, например так:

$where_date = " AND date >= NOW() - INTERVAL 365 DAY AND date < NOW() ";

 

Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, YuriBtr сказал:

Кстати не нашел где формируется условие $where_date, полагаю что про него забыли. В нем можно прописать ограничение по дате, чтобы не тянуть старые новости, например так:


$where_date = " AND date >= NOW() - INTERVAL 365 DAY AND date < NOW() ";

 

where_date формируется в engine/engine.php

$thisdate = date ( "Y-m-d H:i:s", time () );
if ($config['no_date'] AND !$config['news_future']) $where_date = " AND date < '" . $thisdate . "'";
else $where_date = "";

 

Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Gameer сказал:

where_date формируется в engine/engine.php


$thisdate = date ( "Y-m-d H:i:s", time () );
if ($config['no_date'] AND !$config['news_future']) $where_date = " AND date < '" . $thisdate . "'";
else $where_date = "";

 

Ну на самом деле $where_date используется не менее чем в 7 файлах движка. Если приведенное вами выражение инициализирует $where_date именно для show.full.php , то конечно перезаписывать его не надо, как я предложил в последнем абзаце.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, YuriBtr сказал:

Ну на самом деле $where_date используется не менее чем в 7 файлах движка. Если приведенное вами выражение инициализирует $where_date именно для show.full.php , то конечно перезаписывать его не надо, как я предложил в последнем абзаце.

show.full.php подключается в engine/engine.php и переменная так же объявлена в этом файле и больше не перезаписывается а так же участвует в остальных +- 20 запросах engine/engine.php

Ссылка на сообщение
Поделиться на других сайтах
  • 2 месяца спустя...
В 18.06.2018 в 12:23, Gameer сказал:

show.full.php подключается в engine/engine.php и переменная так же объявлена в этом файле и больше не перезаписывается а так же участвует в остальных +- 20 запросах engine/engine.php

Добрый вечер! 

А можно как то сделать вывод похожих новостей за определенный только период времени?

Ссылка на сообщение
Поделиться на других сайтах
  • 2 месяца спустя...

Не понимаю что происходит! Для модуля существуют только 4 - все остальные 9 страниц из данной категории , ссылаются только на 4 страницы. Хелп, SOS и все такое!

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Mr.IG сказал:

Не понимаю что происходит! Для модуля существуют только 4 - все остальные 9 страниц из данной категории , ссылаются только на 4 страницы. Хелп, SOS и все такое!

Правила форума

Внимание !!!

На данном форуме существуют достаточно жесткие правила, поэтому прежде чем создавать свою тему убедитесь, что вы внимательно их прочитали и поняли.

 

1. Если ваша тема начинается с вопроса и вам нужна какая либо помощь, то в самой теме в обязательном порядке вы должны указывать ссылку на ваш сайт. Если ваш сайт находится в локальной сети и вы не можете предоставить ссылку, или вы не хотите публиковать открытой ссылки на ваш сайт, то отправляйте персональное сообщение с вопросом в службу поддержки непосредственно с сайта http://dle-news.ru/, вам ответят на ваш вопрос в персональном порядке, в случае если пользуетесь платной версией скрипта и обладаете лицензией на скрипт. Если вы пользуетесь демоверсией, то вам необходимо разместить сайт в сети интернет, и только потом обращаться за помощью. По находящимся на локальных компьютерах демоверсиям никакой помощи и поддержки на форуме не оказывается. Если вы не указали сайт, то ваша тема будет закрыта, а аккаунт на форуме заблокирован.

Ссылка на сообщение
Поделиться на других сайтах
  • 4 недели спустя...

Столкнулся и я с вопросом выборки похожих новостей. Только задача у меня другая. Как исключить из блока похожих новостей статьи, которые не принадлежат ни к какой категории.  Может есть у кого какие-нибудь мысли на этот счет? Поделитесь плиз, если не затруднит. Спасибо.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, ss.seregin сказал:

Столкнулся и я с вопросом выборки похожих новостей. Только задача у меня другая. Как исключить из блока похожих новостей статьи, которые не принадлежат ни к какой категории.  Может есть у кого какие-нибудь мысли на этот счет? Поделитесь плиз, если не затруднит. Спасибо.

Включить показ похожих новостей только из категорий просматриваемой новости, это должно решить вашу проблему.

Изменено пользователем SSID
Ссылка на сообщение
Поделиться на других сайтах
В 24.12.2018 в 03:16, SSID сказал:

Включить показ похожих новостей только из категорий просматриваемой новости, это должно решить вашу проблему.

Изменено Понедельник в 03:17 пользователем SSID

Спасибо, работает.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...