我正在制作预订网站,并且已经实现了elasticsearch。我的搜索工作正常,但是现在我陷入了一个问题。

我想做的是在搜索结果中显示用户搜索的公寓的最低价格。

价格存储在“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

这是我的文档和实际搜索的 View :

搜索 View :

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, })

elasticsearch文件:

apartments = Index('apartments')


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

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

        ]

我曾尝试将apartment_id传递给搜索 View ,但无法使其正常工作。

有人能指出我正确的方向吗?如何从ES查询访问模型数据?

谢谢 !

最佳答案

如果您已经将价格存储在 flex 中,则可以再次请求,因为 flex 与关系无关。您必须搜索与返回的apartment_id列表相关的所有价格。
如果您将价格存储在apartment_id字段中,则可以使用所有ID进行“条款”查询。

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

您将获得2个结果集,其中一个包含公寓(您实际的一个),另一个包含公寓价格。您需要循环显示正确的数据。

- - - 评论 - - -

我认为您的搜索 View 中存在一个问题,您在数据库中进行了搜索:
公寓= Apartment.objects.all()

然后输入参数q(我希望是公寓的标题)
q = request.GET.get('q')

然后您进行 Elasticsearch 并覆盖带有json结果的数据库结果的公寓...您将无法在模板中处理结果。

首先,您需要删除对数据库的第一次调用,并在 View 中仅使用 flex 对象,否则将很难处理2种单一对象,因为您可以在 flex 模型中无法定义的数据库模型对象上拥有属性。
我们使用了将近7年的 flex 模型,并且很难用两种模型来管理 View 。现在,我们主要在 View 中使用 flex ,这取决于您的使用情况,但是请不要融合这两种模型,而是选择其中一种。
如果打算使用 flex 模型,则在搜索中删除数据库调用;如果在另一个数据库中不使用 flex 模型,则删除数据库调用。

10-06 08:56
查看更多