Django-使用PostgreSQL和Elasticsearch进行全文搜索

时间:2018-06-20 09:45:44

标签: django postgresql rest elasticsearch full-text-search

我有一个DjangoDjango REST Framework支持的RESTful API(与PostgreSQL数据库后端进行通信),该API支持对特定模型进行过滤。

现在,我想添加全文搜索功能。

是否可以使用Elasticsearch进行全文搜索,然后在这些搜索结果之上应用我现有的API过滤器?

2 个答案:

答案 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

如果您想进一步加深,可以阅读我写的关于该主题的文章

Full-Text Search in Django with PostgreSQL

答案 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等替代方案...