我正在编写一个相当简单的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的查询语言中没有内置任何东西.
djangos orm没有开箱即用的这种行为,但有几个项目集成了django w/search服务,如:
狮身人面像(django-sphinx)
solr,轻量级lucene(djangosearch)
lucene(django-search-lucene)
我不能说选项#2和#3的工作情况有多好,但我已经使用了django-sphinx了很多,并对结果非常满意.