CMS DataLife Engine - Система управления сайтами

YuriBtr

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

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

Заметил, что выборка похожих новостей через тег {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() ";

 

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

  • Спасибо 1

Поделиться сообщением


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

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

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

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

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

Внимание !!!

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

 

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

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

Изменено пользователем SSID

Поделиться сообщением


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

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

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти