Django - отображение данных модели в результатах поиска Elasticsearch - PullRequest
0 голосов
/ 28 октября 2019

Я делаю сайт бронирования, и я внедрил упругое исследование. У меня все отлично получилось, но теперь я застрял на проблеме.

Я пытаюсь отобразить самую низкую цену за квартиру, которую искал пользователь, в результатах поиска. .

Цены хранятся в модели "ApartmentPrices":

class ApartmentPrices(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete="models.CASCADE", related_name="price")
    price_start_date = models.DateField(blank=True, null=True)
    price_end_date = models.DateField(blank=True, null=True)
    price = models.IntegerField()

    def __str__(self):
        return self.apartment.title

Это мой документ и представление для фактического поиска:

представление поиска:

def search(request):
    apartments = Apartment.objects.all()
    q = request.GET.get('q')

    if q:
        apartments = ApartmentDocument.search().query("match", title=q)
    else:
        apartments = ''

    return render(request, 'search/search_elastic.html', {'apartments': apartments, "q": q, })

эластичный документ поиска:

apartments = Index('apartments')


@apartments.document
class ApartmentDocument(Document):
    class Django:
        model = Apartment

        fields = [
            'title',
            'id',
            'bedrooms',
            'list_date',

        ]

Я попытался передать apartment_id в окно поиска, но не могу заставить его работать.

Может ли кто-нибудь указать мне правонаправление пожалуйста? Как получить доступ к данным модели из запроса ES?

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2019

Если вы уже сохранили цены в эластичном, вы можете сделать второй запрос, так как эластичный не является реляционным. Вы должны найти все цены, связанные со списком возвращенных квартир. Если вы сохранили цены в поле apartment_id, вы можете сделать запрос «условия» со всеми идентификаторами.

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-terms-query.html

Вы получите 2 набора результатов, один с квартирами (ваш фактический)) и один с ценами на квартиры. Для отображения правильных данных вам нужно пройтись по циклам.

------ Комментарий ------

Я думаю, что есть проблема в вашем поиске, вы делаете поискв вашей базе данных: apartments = Apartment.objects.all ()

, тогда вы берете параметр q (который я ожидаю, чтобы быть названием квартиры) q = request.GET.get ('q')

, и вы делаете поиск в эластичном и перезаписываете квартиры, которые являются результатом базы данных с результатами json ... у вас будет проблема с обработкой вашего результата в вашем шаблоне.

Сначала вам нужноудалите первый вызов в базу данных и используйте только эластичный элемент в вашем представлении, иначе будет трудно обрабатывать объекты 2 вида 1, поскольку у вас может быть свойство объекта модели базы данных, которое вы не сможете определить в эластичном объекте. Мы используем эластичный материал почти с 7 лет, и нам было трудно управлять видами с двумя типами моделей. Теперь мы в основном используем эластичный вид, после того, как это зависит от вашего использования, но не плавьте 2 модели, предпочитайте одну. В поиске, если вы планируете использовать эластичную модель, удалите вызов базы данных, если в другой вы используете базу данных, не используйте эластичную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...