Как сортировать текстовые поля (строки) в Django с помощью ElasticSearch-dsl?

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

У меня есть поле ChardField в models.py, которое я хочу отсортировать после восстановления индекса в ElasticSearch (версия 7). Я использую 'django_elasticsearch_dsl' в качестве pip.

Я читал что-то о добавлении 'fielddata' в качестве свойства в 'documents.py' или изменении типа TextField() на KeywordField(), но я понятия не имею, как это правильно сделать.

Мой documents.py на данный момент:

from django_elasticsearch_dsl import Document, fields
from django_elasticsearch_dsl.registries import registry
from .models import Journey

@registry.register_document
class JourneyDocument(Document):
    class Index:

        name = 'journeys'
        settings = {'number_of_shards': 1,
                    'number_of_replicas': 0}

    class Django:
        model = Journey # The model associated with this Document

        fields = [
            'id',
            'departure_time',
            'return_time',
            'departure_station_name',
            'return_station_name',
            'covered_distance',
            'duration',
        ]

... и мой models.py:

class Journey (models.Model):

    id = models.BigAutoField(primary_key=True)
    departure_time = models.DateTimeField(auto_now = False, auto_now_add = False, default=timezone.now)
    return_time = models.DateTimeField(auto_now=False, auto_now_add=False, default=timezone.now)
    departure_station = models.ForeignKey(Station, on_delete=models.CASCADE, related_name='departure_station')
    departure_station_name = models.CharField(max_length=50, default="-")
    return_station = models.ForeignKey(Station, on_delete=models.CASCADE, related_name='return_station')
    return_station_name = models.CharField(max_length=50, default="-")
    covered_distance = models.DecimalField(max_digits=12, decimal_places=2, validators=[MinValueValidator(10, "Covered distance of the journey has to be bigger than 10.")])
    duration = models.PositiveIntegerField(validators=[MinValueValidator(10, "Duration of the journey has to be bigger than 10s.")])

Итак, как я могу отсортировать результаты запроса по 'имя_станции_отправления' в файле views.py следующим образом:

s.sort("departure_station_name")

Прямо сейчас я получаю:

RequestError(400, 'search_phase_execution_exception', 'Текстовые поля не оптимизированы для операций, требующих данных по каждому полю документа, таких как агрегация и сортировка, поэтому эти операции отключены по умолчанию. Пожалуйста, используйте вместо этого поле с ключевым словом. В качестве альтернативы установите fielddata=true для [имя_станции_отправления], чтобы загрузить данные полей путем деинвертирования инвертированного индекса. Обратите внимание, что это может потребовать значительного объема памяти.')

.

До сих пор я пытался преобразовать мои поля ('departure_station_name') и ('return_station_name') в KeywordFields следующим образом:

@registry.register_document
class JourneyDocument(Document):
    class Index:

        name = 'journeys'
        departure_station_name = fields.KeywordField(fielddata=True)
        return_station_name = fields.KeywordField(fielddata=True)

        settings = {'number_of_shards': 1,
                    'number_of_replicas': 0}

    class Django:
        model = Journey # The model associated with this Document

        fields = [
            'id',
            'departure_time',
            'return_time',
            'departure_station_name',
            'return_station_name',
            'covered_distance',
            'duration',
        ]

...но, честно говоря, я понятия не имею, как это сделать, так как в сети мало документации или примеров.

Вернуться на верх