我正在创建一个Web应用程序,以搜索具有其属性(例如教育,经验等)的人员。我不能对所有字段都使用全文搜索,因为某些字段必须模糊匹配。 (例如:如果我们搜索生物技术,则应该选择生物技术,生物技术以及生物技术)。我的数据库在配置文件模型中大约有200个条目,这些条目将出现在搜索结果中。
教育和经验等其他模型通过外键连接到个人资料
因此,我决定选择在哪个领域使用哪种方法。对于学位名称之类的较短字段(在“教育”模型中),我想使用三字母组相似度。对于教育说明等领域,我使用全文搜索。
但是,由于我必须在多个字段中执行此操作,因此我使用了简单的查找,而不是使用搜索向量。
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) |
)
每次搜索都能得到预期的结果。但是,获得它所花费的时间太慢了。我不知道如何使它更快。
答案 0 :(得分:1)
没有类代码,很难找到更好的方法来优化查询。
您可以使用SearchVector构建注释,如下所示:
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
加快全文搜索的速度要了解全文搜索和三字母组合词,可以阅读我写的关于该主题的文章: