我有一个由 Django
和 Django REST Framework
支持的RESTful API(与 PostgreSQL
数据库后端通信),支持在特定模型上进行过滤。
现在我想添加全文搜索功能。
是否可以使用 Elasticsearch
进行全文搜索,然后在这些搜索结果之上应用现有的API过滤器?
我有一个由 Django
和 Django REST Framework
支持的RESTful API(与 PostgreSQL
数据库后端通信),支持在特定模型上进行过滤。
现在我想添加全文搜索功能。
是否可以使用 Elasticsearch
进行全文搜索,然后在这些搜索结果之上应用现有的API过滤器?
Entry.objects.filter(body_text__search='Cheese')
你的问题太广泛了,无法用代码回答,但肯定是可以解决的。
你可以轻松地搜索你的 Elasticsearch,以匹配你的全文检索条件。
然后获取这些行的 PK 字段(或任何其他候选键,用于唯一标识 PostgreSQL 数据库中的行),并过滤你的 Django ORM 支持的模型,以匹配那些你从 Elasticsearch 中找到的 PK。
伪代码如下:
def get_chunk(l, length):
for i in xrange(0, len(l), length):
yield l[i:i + length]
res = es.search(index="index", body={"query": {"match": ...}})
pks = []
for hit in res['hits']:
pks.append(hit['pk'])
for chunk_10k in get_chunk(pks, 10000):
DjangoModel.objects.filter(pk__in=chunk_10k, **the_rest_of_your_api_filters)
编辑
为了解决在弹性查询中可能会找到大量PK的情况,您可以定义一个生成器,该生成器产生结果的连续10K行,以便您不会超出DB查询限制,并确保最佳更新性能。 我使用名为get_chunk
的函数定义它。
对于redis、mongodb等替代方案,类似的方法也可以奏效...