【问题标题】:Translate a python dict into a Solr query string将 python dict 转换为 Solr 查询字符串
【发布时间】:2010-02-04 21:53:08
【问题描述】:

我刚刚开始使用 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 错误,因为它没有正确编码。

这样做的干净方法是什么?

谢谢!

【问题讨论】:

    标签: python django solr


    【解决方案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()])
    

    【讨论】:

    • 很好的解决方案,谢谢!请注意,我认为较新版本的 python 使用“cleaned_data”而不是“clean_data”。但不确定这是否准确。
    【解决方案2】:

    u'\u003A' 不是和u':' 完全一样,在 URL 中转义为 %3A 吗?

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

    【讨论】:

    • 但是 urlencode 会构建一个类似 text=myKeyword1&metadata=myKeyword2 的字符串。这不是我需要的语法(见上文)。我错过了什么吗?
    【解决方案3】:

    使用django-haystack。它负责与 Solr 的所有接口 - 索引和查询。

    【讨论】:

    • 谢谢!我会检查一下。我已经在使用 Solrpy,对于我的目的来说,它看起来不错而且很轻量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多