Как сортировать текстовые поля (строки) в 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',
]
...но, честно говоря, я понятия не имею, как это сделать, так как в сети мало документации или примеров.