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,即公园的所有出现。
答案 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'排名更高。