【发布时间】:2018-07-14 03:57:57
【问题描述】:
我必须实现一个容错的搜索功能。
目前,我有以下情况:
型号:
class Tag(models.Model):
name = models.CharField(max_length=255)
class Illustration(models.Model):
name = models.CharField(max_length=255)
tags = models.ManyToManyField(Tag)
查询:
queryset.annotate(similarity=TrigramSimilarity('name', fulltext) + TrigramSimilarity('tags__name', fulltext))
示例数据:
插图:
ID | Name | Tags |
---|--------|-------------------|
1 | "Dog" | "Animal", "Brown" |
2 | "Cat" | "Animals" |
插图有标签:
ID_Illustration | ID_Tag |
----------------|--------|
1 | 1 |
1 | 2 |
2 | 3 |
标签:
ID_Tag | Name |
-------|----------|
1 | Animal |
2 | Brown |
3 | Animals |
当我使用"Animal" 运行查询时,"Dog" 的相似度应该高于"Cat",因为它是完美匹配。
不幸的是,这两个标签以某种方式被考虑在一起。
目前,它看起来像是将标签连接在一个字符串中,然后检查相似性:
TrigramSimilarity("Animal Brown", "Animal") => X
但我想调整它,使Illustration 实例名称与其标签之间的相似度最高:
Max([
TrigramSimilarity('Name', "Animal"),
TrigramSimilarity("Tag_1", "Animal"),
TrigramSimilarity("Tag_2", "Animal"),
]) => X
Edit1:我正在尝试查询所有插图,其中标题或其中一个标签的相似度大于 X。
Edit2:附加示例:
全文 = '动物'
TrigramSimilarity('Animal Brown', fulltext) => x TrigramSimilarity('Animals', fulltext) => y
其中 x
但我想要的其实是
TrigramSimilarity(Max(['Animal', 'Brown]), fulltext) => x (Similarity to Animal) TrigramSimilarity('Animals', fulltext) => y
其中 x > y
【问题讨论】:
-
你能准确地从哪个模型做查询集吗?另外,这些示例数据是什么?插图的名称+id和标签?
-
问题调整
-
添加了编辑 2(更多详细信息)。
-
是
TrigramSimilarity一个python 函数还是转换成SQL?如果它是 python,我认为您不能在annotate调用中使用它,因为您正在尝试这样做。 -
TrigramSimilarity 是 Django 框架 (docs.djangoproject.com/en/2.0/ref/contrib/postgres/search) 的一部分,但它需要激活 pg_trgm 扩展的 PostgreSQL 数据库(不适用于 SQLite)。
标签: python django postgresql django-queryset trigram