Здравствуйте! <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
При таком условии, наиболее точные совпадения, вероятнее всего всё равно будут выше, даже если они старше. Например, если текст названия полностью совпадает с новостью двухлетней давности.
Хотя, в данном случае надо смотреть ещё отдельно и тьюнить фильтры и метчеры, которые вы используете