我正在尝试ltree
在PostgreSQL中使用扩展来构建全文地址搜索引擎.
我的模型看起来像这样(它略微简化):
from django.db import models class Addresses(models.Model): name = models.CharField(max_length=255) path = models.CharField(max_length=255)
因此,此表中的数据将如下所示:
id | name | path ---------------------------- 1 | USA | 1 2 | California | 1.2 3 | Los Angeles | 1.2.3
我想对每个实体的聚合名称进行全文搜索.基本上我需要将表中的每一行转换为下一个格式来进行搜索:
id | full_name | path ------------------------------------------------- 1 | USA | 1 2 | California USA | 1.2 3 | Los Angeles California USA | 1.2.3
我这样做,所以用户可以执行像'los ang cali'或类似的查询.使用原始 PostgreSQL查询我没有问题:
SELECT *, ts_rank_cd(to_tsvector('english', full_address), query) AS rank FROM (SELECT s.id, s.path, array_to_string(array_agg(a.name ORDER BY a.path DESC), ' ') AS full_address FROM "Addresses" AS s INNER JOIN "Addresses" AS a ON (a.path @> s.path) GROUP BY s.id, s.path, s.name ) AS subquery, to_tsquery('english', %s) as query WHERE to_tsvector('english', full_address) @@ query ORDER BY rank DESC;
这工作正常,但在使用RawQuerySet,我不能用之类的东西.filter()
,.group_by()
,分页等.
在Django中重现它的主要限制是这个JOIN:
JOIN "Addresses" AS a ON (a.path @> s.path)
它是用来连接各元素的所有祖先,然后用它们聚集array_agg()
,array_to_string
功能,因此这些功能的输出可进一步使用全文搜索.
如果有人有更好的想法如何使用Django ORM实现这种事情,请指教.