当前位置:  开发笔记 > 编程语言 > 正文

Django"你的意思是?" 询问

如何解决《Django"你的意思是?"询问》经验,为你挑选了2个好方法。

我正在编写一个相当简单的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查询语言中.对我来说写一个巨大的算法并不重要,因为我真的只是在寻找内置的东西.

提前感谢所有答案.



1> nosklo..:

您可以尝试使用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的查询语言中没有内置任何东西.



2> 小智..:

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

狮身人面像(django-sphinx)

solr,轻量级lucene(djangosearch)

lucene(django-search-lucene)

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

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有