将Python字典转换为Solr查询字符串

0 投票
3 回答
1162 浏览
提问于 2025-04-15 18:54

我刚开始学习Python,现在在把一组request.POST参数转换成Solr查询语法时遇到麻烦。

这个表单的定义是这样的:

class SearchForm(forms.Form):
    text = forms.CharField()
    metadata = forms.CharField()
    figures = forms.CharField()

提交后,这个表单需要生成一个URL编码的字符串,以便传递给一个URL客户端,格式大概是这样的:

text:myKeyword1+AND+metadata:myKeyword2+AND+figures:myKeyword3

看起来应该有个简单的方法来做到这一点。我能做到的最接近的是

for f, v in request.POST.iteritems():
   if v:
       qstring += u'%s\u003A%s+and+' % (f,v)

不过在这种情况下,冒号(\u003A)会导致Solr出错,因为它没有被正确编码。

有没有什么干净的解决办法呢?

谢谢!

3 个回答

0

可以使用 django-haystack。这个工具会帮你处理与Solr之间的所有交互,包括数据的索引和查询。

0

难道 u'\u003A' 不就是和 u':' 一样吗?在网址中,冒号会被转义成 %3A 吗?

qstring = '+AND+'.join(
    [ u'%s%%3A%s'%(f,v) for f,v in request.POST.iteritems() if f]
    ) 
1

我建议在表单中创建一个函数来处理这个问题,而不是在视图中处理。也就是说,在你调用 form.isValid() 来确保数据是有效的之后,你可以调用 form.generateSolrQuery()(或者你想要的任何名字)。

class SearchForm(forms.Form):
  text = forms.CharField()
  metadata = forms.CharField()
  figures = forms.CharField()

  def generateSolrQuery(self):
    return "+and+".join(["%s\u003A%s" % (f,v) for f,v in self.cleaned_data.items()])

撰写回答