Django"你的意思是?" 询问

Mat*_*ell 3 python django spell-checking

我正在编写一个相当简单的Django应用程序,用户可以输入字符串查询.应用程序将通过数据库搜索此字符串.

Entry.objects.filter(headline__contains=query)
Run Code Online (Sandbox Code Playgroud)

这个查询非常紧张,但对于那些不能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)
Run Code Online (Sandbox Code Playgroud)

我想为此添加一些额外的功能.搜索未拼写拼写单词,复数形式,常见同音异义词(声音拼写不同),等等.我只是想知道这些东西是否内置于Djangos查询语言中.对我来说写一个巨大的算法并不重要,因为我真的只是在寻找内置的东西.

提前感谢所有答案.

nos*_*klo 11

您可以尝试使用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']
Run Code Online (Sandbox Code Playgroud)

问题是要使用difflib,必须从数据库中构建一个单词列表.这可能很昂贵.也许如果你缓存单词列表并且只在一段时间内重建它.

一些数据库系统支持搜索方法来执行您想要的操作,例如PostgreSQL的fuzzystrmatch模块.如果是你的情况,你可以尝试调用它.


编辑:

对于你的新"要求",嗯,你运气不好.不,django的查询语言中没有内置任何东西.


小智 5

djangos orm没有开箱即用的这种行为,但有几个项目集成了django w/search服务,如:

我不能说选项#2和#3的工作情况有多好,但我已经使用了django-sphinx了很多,并对结果非常满意.