首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用postgres将trigram相似度和全文搜索与Q ind django结合使用时,性能较差

使用postgres将trigram相似度和全文搜索与Q ind django结合使用时,性能较差
EN

Stack Overflow用户
提问于 2019-06-11 15:16:56
回答 2查看 1.2K关注 0票数 2

我正在创建一个web应用程序来搜索人们的属性,如教育,经验等。我不能使用全文搜索所有的领域,因为,一些必须是模糊匹配。(例如:如果我们搜索生物技术,它应该选择生物技术,生物技术和生物技术)。我的数据库在配置文件模型中有大约200个条目,它将出现在搜索结果中。

其他模型,如教育和经验,通过外键连接到配置文件

因此,我决定选择在哪个领域使用什么方法。对于较短的字段,如学位名称(在教育模型中),我希望使用三元组相似度。对于像教育描述这样的字段,我使用全文搜索。

但是,由于我必须在多个字段中执行此操作,因此我使用了简单的查找,而不是使用搜索向量。

代码语言:javascript
运行
复制
Profile.objects.filter(
    Q(first_name__trigram_similar=search_term) |
    Q(last_name__trigram_similar=search_term) |
    Q(vision_expertise__search=search_term) |
    Q(educations__degree__trigram_similar=search_term) |
    Q(educations__field_of_study__trigram_similar=search_term) |
    Q(educations__school__trigram_similar=search_term) |
    Q(educations__description__search=search_term) |
    Q(experiences__title__trigram_similar=search_term) |
    Q(experiences__company__trigram_similar=search_term) |
    Q(experiences__description__search=search_term) |
    Q(publications__title__trigram_similar=search_term) |
    Q(publications__description__search=search_term) |
    Q(certification__certification_name__trigram_similar=search_term) |
    Q(certification__certification_authority__trigram_similar=search_term) |
    Q(bio_description__search=search_term) |
)

我在每次搜索时都会得到预期的结果。然而,获得它所需的时间却慢得离谱。我想不出怎么让它更快。

EN

回答 2

Stack Overflow用户

发布于 2019-06-11 23:40:08

如果没有类代码,就很难找到优化查询的更好方法。

您可以添加GinGist索引来加快三元组相似度。

您可以使用SearchVector构建注释,如下所示:

代码语言:javascript
运行
复制
from django.contrib.postgres.aggregates import StringAgg
from django.contrib.postgres.search import SearchQuery, SearchVector

search_vectors = (
    SearchVector('vision_expertise') +
    SearchVector('bio_description') +
    SearchVector(StringAgg('experiences__description', delimiter=' ')) +
    SearchVector(StringAgg('educations__description', delimiter=' ')) +
    SearchVector(StringAgg('publications__description', delimiter=' '))
)

Profile.objects.annotate(
    search=search_vectors
).filter(
    Q(search=SearchQuery(search_term)) |
    Q(first_name__trigram_similar=search_term) |
    Q(last_name__trigram_similar=search_term) |
    Q(educations__degree__trigram_similar=search_term) |
    Q(educations__field_of_study__trigram_similar=search_term) |
    Q(educations__school__trigram_similar=search_term) |
    Q(experiences__title__trigram_similar=search_term) |
    Q(experiences__company__trigram_similar=search_term) |
    Q(publications__title__trigram_similar=search_term) |
    Q(certification__certification_name__trigram_similar=search_term) |
    Q(certification__certification_authority__trigram_similar=search_term)
)

您可以使用SearchVectorField加速全文搜索

要了解全文搜索和trigram,你可以阅读我写的关于这个主题的文章:

"Full-Text Search in Django with PostgreSQL"

票数 2
EN

Stack Overflow用户

发布于 2021-12-19 11:15:46

在postgres中添加Trigram索引以提高性能,例如用于users.first_name和users.last_name索引:

代码语言:javascript
运行
复制
CREATE INDEX index_users_full_name
             ON users using gin ((first_name || ' ' || last_name) gin_trgm_ops);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56538419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档