Python 当使用postgres将三角图相似性和全文搜索与Q ind django相结合时,性能较差

Python 当使用postgres将三角图相似性和全文搜索与Q ind django相结合时,性能较差,python,django,postgresql,full-text-search,trigram,Python,Django,Postgresql,Full Text Search,Trigram,我正在创建一个web应用程序来搜索具有教育、经验等属性的人。我不能对所有字段使用全文搜索,因为有些字段必须是模糊匹配。(例如:如果我们搜索生物技术,它应该选择生物技术、生物技术以及生物技术)。我的数据库在配置文件模型中有大约200个条目,这些条目将出现在搜索结果中 其他模式,如教育和经验,通过外键连接到个人资料 因此,我决定选择在哪个领域使用什么方法。对于较短的字段,如学位名称(在教育模型中),我想使用三元相似性。对于教育描述等字段,我使用全文搜索 但是,由于我必须在多个字段中执行此操作,因此我

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

其他模式,如教育和经验,通过外键连接到个人资料

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

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

Profile.objects.filter(
Q(名字三元图相似=搜索项)|
Q(姓氏三元图相似=搜索项)|
Q(愿景、专业知识、搜索=搜索词)|
Q(教育程度、学位、三角图、相似=搜索词)|
Q(教育\u领域\u研究\u三角图\u相似=搜索词)|
Q(教育\学校\三角图\相似=搜索项)|
Q(教育\描述\搜索=搜索\术语)|
Q(经验\uuuuu标题\uuuuuuu三角图\uu相似=搜索词)|
Q(经验\公司\三角图\相似=搜索项)|
Q(经验描述搜索=搜索词)|
Q(出版物\uuuuu标题\uuuuuuu三角图\uu相似=搜索词)|
Q(出版物描述搜索=搜索词)|
Q(认证\认证\名称\三角图\相似=搜索\术语)|
Q(认证机构、认证机构、三元图、相似=搜索词)|
Q(生物描述搜索=搜索词)|
)

每次搜索我都会得到预期的结果。然而,获得它所需的时间却慢得可笑。我想不出如何加快查询速度。

没有类代码,很难找到更好的方法来优化查询

您可以添加一个或索引来加速三元图的相似性

您可以使用以下方法生成注释:

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。我实际上给出了你刚才在答案中给出的搜索向量。但是,我得到一个错误,说
FieldError:Joined字段引用在此查询中是不允许的
我认为我们不能在该字段中使用聚合器,例如StringAgg。这有解决办法吗?正如我之前所说的,如果没有类代码,我不可能给出完整的答案。