使用python以json格式向SOLR发送具有facet的请求,返回响应400(JSON请求中的未知顶级键:分面.字段)

bqjvbblv  于 2023-03-18  发布在  Solr
关注(0)|答案(1)|浏览(226)

我正在使用python(Django)以json格式(JSON request API)向SOLR(9.0.0)发送请求来检索数据。当使用faceting时,我遇到了一个问题,可能是由于请求的json格式。有人能帮忙吗?
我的目标是从一个core的字段“sentence”中搜索任意两个小写字母的单词(使用regex [a-z]{2})。
此查询可从SOLR admin(URL已解码)正确运行,并提供所需的结果:
http://localhost:8983/solr/lexdb_genl93/select?facet.field=sentence&facet.matches=[a-z]{2}&facet.query=sentence:/[a-z]{2}/&facet=true&indent=true&q.op=OR&q=*:*&rows=0&start=0
我的请求json,返回400(JSON请求中未知的顶级键:分面字段):

{
   "query":"*:*",
   "limit":0,
   "facet":"true",
   "facet.field":"sentence",
   "facet.matches":"[a-z]{2}",
   "facet.query":"sentence:/[a-z]{2}/"
}

Python代码:

import requests

prerule= '[a-z]{2}'
solr_query= {"query": "*:*", 'limit':0, "facet": "true", "facet.field": "sentence", "facet.matches": prerule, "facet.query": "sentence:/"+prerule+"/"}
solr_headers = {'Content-type': 'application/json'}
resp = requests.post(lexsettings.solr_url+'/query', data=json.dumps(solr_query), headers=solr_headers, auth=(lexsettings.solr_user, lexsettings.solr_pass))
jresp= json.loads(resp.content)
print('solrlist: '+str(jresp))

print语句的)输出的错误部分:

"error":{
    "metadata":[
    "error-class",
    "org.apache.solr.common.SolrException",
    "root-error-class",
    "org.apache.solr.common.SolrException"
    ],
    "msg":"Unknown top-level key in JSON request : facet.field",
    "code":400
}

谢谢你阅读到这里。如果你需要任何进一步的信息,请让我知道。

whlutmcx

whlutmcx1#

这是因为有效的查询和你要处理的请求完全不一样,你需要查询参数来完成大部分的工作,所以你的请求应该是:

import requests

prerule= '[a-z]{2}'
solr_query= {
    "q": "*:*", 
    'limit':0, 
    "facet": "true", 
    "facet.field": "sentence", 
    "facet.matches": prerule, 
    "facet.query": f"sentence:/{prerule}/"
}

solr_headers = {'Content-type': 'application/json'}

resp = requests.post(
    lexsettings.solr_url+'/query', 
    params=solr_query, # <--------- Note the params kwarg
    headers=solr_headers, 
    auth=(lexsettings.solr_user, lexsettings.solr_pass)
)

print(resp.json())

如果你真的需要把它作为json发送,那么使用json kwarg而不是data

resp = requests.post(
    lexsettings.solr_url+'/query', 
    json=solr_query, # <---------- Here
    headers=solr_headers, 
    auth=(lexsettings.solr_user, lexsettings.solr_pass)
)

相关问题