python - Django "Did you mean?"查询

标签 python django spell-checking

我正在编写一个相当简单的 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/

相关文章:

python - 获取 flask 中最后插入的 id 时出现问题

django - 自定义 usercreationform 在 Django 中的外观

algorithm - 我如何使用 Trie 进行拼写检查

java - 如何让 android spellchecker 框架工作

Ckeditor:使用内置拼写检查器的 Firefox

python - 在Pycharm中无法添加conda环境

python - 单选按钮变量不更新

python - 为什么在 Django 启动时调用表单字段 __init__ 方法?

django - 在多个 django 模板文件中显示相同 html block 的最佳 DRY 方法

django - 未调用 mixin 中的 get_context_data