Здравствуйте! <br/> <br/> В нашем проекте мы используем Elasticsearch для поиска новостей на сайте, при этом для формирования запросов применяется библиотека <a href="https://github.com/ongr-io/ElasticsearchDSL" rel="nofollow">ElasticsearchDSL</a>. Могли бы вы поделиться индексом, который у нас настроен? Вот его структура: <br/> <pre><code class="php">[ 'index' => $name, 'body' => [ 'settings' => [ 'analysis' => [ 'analyzer' => [ 'ru' => [ 'char_filter' => ['html_strip'], 'tokenizer' => 'standard', 'filter' => ['lowercase', 'hunspell_ru', 'stopwords_ru', 'custom_word_delimiter', 'stop'], ], ], 'filter' => [ 'hunspell_ru' => [ 'type' => 'hunspell', 'locale' => 'ru_RU', 'dedup' => true, ], 'stopwords_ru' => [ 'type' => 'stop', 'stopwords' => ['а', 'без', 'более', 'бы', 'был', 'была', 'были', 'было', 'быть', 'в', 'вам', 'вас', 'весь', 'во', 'вот', 'все', 'всего', 'всех', 'вы', 'где', 'да', 'даже', 'для', 'до', 'его', 'ее', 'если', 'есть', 'еще', 'же', 'за', 'здесь', 'и', 'из', 'или', 'им', 'их', 'к', 'как', 'ко', 'когда', 'кто', 'ли', 'либо', 'мне', 'может', 'мы', 'на', 'надо', 'наш', 'не', 'него', 'нее', 'нет', 'ни', 'них', 'но', 'ну'
Чтобы отсортировать новости в результатах поиска по дате их публикации в Elasticsearch, необходимо убедиться, что поле, хранящее дату публикации, правильно проиндексировано и имеет тип `date`. Когда вы будете формировать запрос на поиск, добавьте сортировку по этому полю. Вот пример, как это можно сделать с помощью библиотеки ElasticsearchDSL в PHP: 1. Убедитесь, что в индексе ваше поле для даты имеет правильный тип. Например, он должен быть определен как `date` в вашей схеме индекса: ```json { "mappings": { "properties": { "published_date": { "type": "date" } // другие поля... } } } ``` 2. Формирование запроса с сортировкой: ```php use ONGR\ElasticsearchDSL\Builder\SearchBuilder; use ONGR\ElasticsearchDSL\Sort\FieldSort; // Создаем поисковый запрос $searchBuilder = new SearchBuilder(); $searchBuilder->addQuery(/* ваш запрос на поиск */); // Добавляем сортировку по дате $sort = new FieldSort('published_date'); $sort->setOrder('desc'); // 'asc' для сортировки по возрастанию, 'desc' для убывания $searchBuilder->addSort($sort); // Вы можете выполнить запрос, используя ваш клиент Elasticsearch $result = $client->search($searchBuilder); // Обработка результатов ``` В этом примере мы создаем `SearchBuilder`, добавляем к нему ваш поисковый запрос и затем добавляем сортировку по полю `published_date`. Метод `setOrder` позволяет определить порядок сортировки. Проверьте, чтобы все новости, которые вы индексируете, имели корректное значение даты в поле `published_date`. Если поле не заполнено или заполнено неправильно, это может повлиять на корректность сортировки.
Интересный кейс. Я бы возможно вручную определил интервалы и давал по ним бусты.
Допустим:
новости за сегодня - буст = 10
новости за последнюю неделю - буст = 5
новости за последний месяц - буст = 3
новости за последний год - буст = 1
новости старше - буст = 0.2
При таком условии, наиболее точные совпадения, вероятнее всего всё равно будут выше, даже если они старше. Например, если текст названия полностью совпадает с новостью двухлетней давности.
Хотя, в данном случае надо смотреть ещё отдельно и тьюнить фильтры и метчеры, которые вы используете