如何使这个django属性名称搜索更好?

时间:2011-06-22 06:14:31

标签: django

lcount = Open_Layers.objects.all()
form = SearchForm()

if request.method == 'POST': 
    form = SearchForm(request.POST) 
    if form.is_valid():
        data = form.cleaned_data
        val=form.cleaned_data['LayerName']

        a=Open_Layers()
        data = []
        for e in lcount:
            if e.Layer_name == val:     
                data = val 

        return render_to_response('searchresult.html', {'data':data})

    else:
        form = SearchForm()

 else:
    return render_to_response('mapsearch.html', {'form':form})

如果特定的“名称”匹配,则返回。如何更改它以便在我搜索“Park”时它返回,它应该返回Park1,Park2,Parking,Parkin,即公园的所有出现。

3 个答案:

答案 0 :(得分:1)

您可以使用list累积结果来改善搜索逻辑,并使用re模块来匹配更多的单词。

然而,这仍然非常有限,容易出错且难以维护甚至更难以进化。此外,您将永远不会像使用搜索引擎那样获得良好的结果。

因此,您应该花一些时间设置haystack,而不是尝试手动重新发明轮子,汽车和高速公路。现在这是在Django中进行搜索的事实上的标准。

首先使用woosh作为后端,这会更容易。如果搜索速度变慢,请将其替换为solr

编辑:

简单清洁替代方案:

Open_Layers.objects.filter(name__icontains=val)

这将执行SQL LIKE,为您添加%`。

如果过于频繁使用,会导致您的数据库被杀,但我想这可能不会成为您当前项目的问题。

BTW,您可能希望将Open_Layers重命名为OpenLayers,因为这是Python PEP8命名约定。

答案 1 :(得分:0)

而不是

if e.Layer_name == val:     
   data = val 

使用

if val in e.Layer_name:     
   data.append(e.Layer_name) 

(并且您不需要行data = form.cleaned_data

答案 2 :(得分:0)

我意识到这是一个老帖子,但无论如何:

python标准库中已经存在模糊逻辑字符串比较。

import difflib 

主要看看:

difflib.SequenceMatcher(None, a='string1', b='string2', autojunk=True).ratio()

更多信息: http://docs.python.org/library/difflib.html#sequencematcher-objects

它做了什么它返回两个字符串的接近程度的比率,介于0和1之间。因此,不是测试它们是否相等,而是选择相似比。

值得注意的是,您可能希望将两个字符串转换为小写字母。

string1.lower()

另请注意,您可能想要使用重新分割字符串,即.split()或其他内容,以便搜索“David”对抗'David Brent'排名更高。