我正在制作预订网站,并且已经实现了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 模型,则删除数据库调用。