Как можно отсортировать новости в результатах поиска по дате их публикации?

Здравствуйте! <br/> <br/> В нашем проекте мы используем Elasticsearch для поиска новостей на сайте, при этом для формирования запросов применяется библиотека <a href="https://github.com/ongr-io/ElasticsearchDSL" rel="nofollow">ElasticsearchDSL</a>. Могли бы вы поделиться индексом, который у нас настроен? Вот его структура: <br/> <pre><code class="php">[
            'index' =&gt; $name,
            'body' =&gt; [
                'settings' =&gt; [
                    'analysis' =&gt; [
                        'analyzer' =&gt; [
                            'ru' =&gt; [
                                'char_filter' =&gt; ['html_strip'],
                                'tokenizer' =&gt; 'standard',
                                'filter' =&gt; ['lowercase', 'hunspell_ru', 'stopwords_ru', 'custom_word_delimiter', 'stop'],
                            ],
                        ],
                        'filter' =&gt; [
                            'hunspell_ru' =&gt; [
                                'type' =&gt; 'hunspell',
                                'locale' =&gt; 'ru_RU',
                                'dedup' =&gt; true,
                            ],
                            'stopwords_ru' =&gt; [
                                'type' =&gt; 'stop',
                                'stopwords' =&gt; ['а', 'без', 'более', 'бы', 'был', 'была', 'были', 'было', 'быть', 'в', 'вам', 'вас', 'весь', 'во', 'вот', 'все', 'всего', 'всех', 'вы', 'где', 'да', 'даже', 'для', 'до', 'его', 'ее', 'если', 'есть', 'еще', 'же', 'за', 'здесь', 'и', 'из', 'или', 'им', 'их', 'к', 'как', 'ко', 'когда', 'кто', 'ли', 'либо', 'мне', 'может', 'мы', 'на', 'надо', 'наш', 'не', 'него', 'нее', 'нет', 'ни', 'них', 'но', 'ну'
  • 19 декабря 2024 г. 18:24
Ответы на вопрос 2
Чтобы отсортировать новости в результатах поиска по дате их публикации в 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

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