Python 通过在Django模型字段中搜索文本来搜索匹配项
我有一个类似的模型Python 通过在Django模型字段中搜索文本来搜索匹配项,python,django,caching,search,model,Python,Django,Caching,Search,Model,我有一个类似的模型 class Item(models.Model): value = models.IntegerField() words = models.CharField(max_length=512, unique=True) 我希望能够搜索对象,并返回特定查询的最佳匹配项。”“最佳匹配”可以定义为与words字段最接近的基于文本的结果(我可以编写一个函数,返回“接近度”的整数表示。没问题,模型搜索和缓存是问题所在) 理想情况下,每次进行搜索时(如果以前进行过搜索)
class Item(models.Model):
value = models.IntegerField()
words = models.CharField(max_length=512, unique=True)
我希望能够搜索对象,并返回特定查询的最佳匹配项。”“最佳匹配”可以定义为与words
字段最接近的基于文本的结果(我可以编写一个函数,返回“接近度”的整数表示。没问题,模型搜索和缓存是问题所在)
理想情况下,每次进行搜索时(如果以前进行过搜索),只应搜索自上次进行查询以来的新元素(其他结果已缓存)。我找不到一个django模块来实现这一点
一些信息:
DB:postgres
连接器:psycopg2您可以使用difflib对查询进行排序,因此它会将最佳匹配项放在顶部[-1]
>>> import difflib
>>> a = ["spam", "eggs", "spammy", "eggy"]
>>> b = 'spam'
>>> sorted(a, key=lambda x: difflib.SequenceMatcher(None, x, b).ratio())
['eggy', 'eggs', 'spammy', 'spam']
您可以使用difflib对查询进行排序,以便将最佳匹配项放在顶部[-1]
>>> import difflib
>>> a = ["spam", "eggs", "spammy", "eggy"]
>>> b = 'spam'
>>> sorted(a, key=lambda x: difflib.SequenceMatcher(None, x, b).ratio())
['eggy', 'eggs', 'spammy', 'spam']
这不完全是我想要的,因为它会在每次执行搜索之前从我的数据库中提取整个数据集,然后才能解析它。这不完全是我想要的,由于每次执行搜索时都会从我的数据库中提取整个数据集,然后才能对其进行解析,因此最终我使用了带有Django插件的弹性搜索,因为Django内部的模式匹配过于昂贵。我最终使用了带有Django插件的弹性搜索,因为Django内部的模式匹配太昂贵了。