我正在编写一个相当简单的 Django 应用程序,用户可以在其中输入字符串查询。应用程序将在数据库中搜索此字符串。
Entry.objects.filter(headline__contains=query)
这个查询非常直截了当,但对于那些不能 100% 确定他们在寻找什么的人来说并没有真正的帮助。所以我扩大了搜索范围。
from django.utils import stopwords
results = Entry.objects.filter(headline__contains=query)
if(!results):
query = strip_stopwords(query)
for(q in query.split(' ')):
results += Entry.objects.filter(headline__contains=q)
我想为此添加一些额外的功能。搜索拼写错误的单词、复数、常见的同音异义词(发音相同拼写不同)等。我只是想知道这些东西是否内置在 Djangos 查询语言中。编写一个庞大的算法对我来说还不够重要,因为我真的只是在寻找内置的东西。
预先感谢您的所有回答。
最佳答案
您可以尝试使用 python 的 difflib模块。
>>> from difflib import get_close_matches
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']
问题是要使用 difflib,必须从数据库中构建一个单词列表。那可能很昂贵。也许如果您缓存单词列表并且只偶尔重建它一次。
一些数据库系统支持搜索方法来做你想做的事,比如 PostgreSQL 的 fuzzystrmatch
模块。如果是这种情况,您可以尝试调用它。
编辑:
对于您的新“要求”,嗯,您真倒霉。不,django 的查询语言中没有内置任何内容。
关于python - Django "Did you mean?"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/476394/