我有一个Django
和Django REST Framework
支持的RESTful API(与PostgreSQL
数据库后端进行通信),该API支持对特定模型进行过滤。
现在,我想添加全文搜索功能。
是否可以使用Elasticsearch
进行全文搜索,然后在这些搜索结果之上应用我现有的API过滤器?
答案 0 :(得分:2)
我建议您考虑只使用 PostgreSQL 来满足您的要求。
我认为这是最好的解决方案,因为您将直接在 PostgreSQL 中拥有数据和搜索索引,并且不会被迫安装和维护其他软件(例如 Elasticsearch ),并使数据和索引保持同步。
这是最简单的代码示例,您必须在PostgreSQL和Django中执行full-text search:
Entry.objects.filter(body_text__search='Cheese')
对于在PostgreSQL和Django中使用full-text search的所有基本文档,您可以使用官方文档:“ Full text search” >
如果您想进一步加深,可以阅读我写的关于该主题的文章:
答案 1 :(得分:0)
您的问题太广泛了,无法用代码来回答,但这绝对是可能的。
您可以轻松地在Elasticsearch中搜索与全文标准匹配的行。
然后获取这些行的PK字段(或任何其他候选键,用于唯一标识PostgreSQL dB中的行),并过滤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的情况,可以定义一个生成器,该生成器连续产生1万行结果,这样就不会超出数据库查询限制并确保最佳更新性能。我已经在上面使用名为get_chunk
的函数对其进行了定义。
类似的东西适用于redis,mongodb等替代方案...