我必须实现一个容错的搜索功能。
目前,我有以下情况:
楷模:
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"
, for 的相似性"Dog"
应该高于 for "Cat"
,因为它是完美匹配的。
不幸的是,这两个标签以某种方式被考虑在一起。
目前,它看起来像是将标签连接在一个字符串中,然后检查相似性:
TrigramSimilarity("Animal Brown", "Animal") => X
但我想调整它,使Illustration
实例名称与其标签之间的相似度最高:
Max([
TrigramSimilarity('Name', "Animal"),
TrigramSimilarity("Tag_1", "Animal"),
TrigramSimilarity("Tag_2", "Animal"),
]) => X
Edit1:我正在尝试查询所有插图,其中标题或其中一个标签的相似度大于 X。
编辑2:附加示例:
全文 = '动物'
TrigramSimilarity('Animal Brown', fulltext) => x TrigramSimilarity('Animals', fulltext) => y
其中 x < y
但我想要的其实是
TrigramSimilarity(Max(['Animal', 'Brown]), fulltext) => x (Similarity to Animal) TrigramSimilarity('Animals', fulltext) => y
其中 x > y