django - Django Rest 框架弹性搜索:RequestError 400 parsing_exception
问题描述
在尝试查询与此条件匹配的事件文档时,我遇到了解析异常,我不确定是什么原因造成的。这发生在我的自定义 get_queryset 方法中。在我的文档视图集中的 get_query 中,我遇到了一个错误。
def get_queryset(self):
qs = super().get_queryset()
user = self.request.user
if hasattr(user, 'userprofile'):
user_universities = user.userprofile.universities.all().values_list("id")
user_universities_campus = user.userprofile.universities.all().values_list("main_campus__id")
query = query | Q('bool', must=[
Q('match', visibility_scope=Event.UNIVERSITY),
Q('bool', must=[
Q('terms', university__id=list(user_universities)),
Q('bool', should=[
Q('terms', university__main_campus__id=list(user_universities)),
Q('terms', university__main_campus__id=list(user_universities_campus))
])
])
])
qs = qs.query(query)
return qs
我收到此错误:
if self.count == 0 and not self.allow_empty_first_page:
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\django\utils\functional.py", line 80, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\django\core\paginator.py", line 91, in count
return c()
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch_dsl\search.py", line 679, in count
**self._params
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch\client\utils.py", line 84, in _wrapped
return func(*args, params=params, **kwargs)
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch\client\__init__.py", line 529, in count
"POST", _make_path(index, doc_type, "_count"), params=params, body=body
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch\transport.py", line 358, in perform_request
timeout=timeout,
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch\connection\http_urllib3.py", line 261, in perform_request
self._raise_error(response.status, raw_data)
File "C:\Users\fendy\.virtualenvs\cul\lib\site-packages\elasticsearch\connection\base.py", line 182, in _raise_error
status_code, error_message, additional_info
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[terms] unknown token [END_ARRAY] after [university.id]')
查询字符串打印输出:
Bool(should=[Bool(must=[Match(visibility_scope=2), Bool(must=[Terms(university__id=[(42809,)]), Bool(should=[Terms(university__main_campus__id=[(42809,)]), Terms(university__main_campus__id=[(None,)])])])]), Match(visibility_scope=0)])
解决方案
您在字符串中的查询应该是这样的:
{
"bool": {
"should":[
"bool" : {
"must":[
{"match":{
"visibility_scope" : 2
},
"bool":{
"must":[
{
"terms": {
}
....
.....
.....
}
]
}
}
]
}
]
}
}
你能用查询字符串更新你的问题吗?我也许能够完成它。
推荐阅读
- sql - 带有错误 GUID 的 Transact-SQL Select 语句结果
- amazon-web-services - aws cloudfront 签名的 url 和 mediapackage
- performance - 单独压缩每一行还是压缩整个文件更好?
- javascript - ReferenceError: openpgp 未定义
- java - HTTPS OpenStreetMap URL 无法通过 java 应用程序访问,而可通过浏览器和 IntelliJ“测试连接”访问
- java - Glassfish4:Waffle SSO Servlet 过滤器提供基本身份验证登录弹出窗口
- testing - Conftest 对有效的 Kubernetes YAML 文件失败
- firebase - Firebase 函数记录器日志未定义
- ssl - Nginx:“上游断开”日志是什么意思?
- python - 获取某些行 pandas 的总和