【问题标题】:Django Rest Framework Elastic Search: RequestError 400 parsing_exceptionDjango Rest 框架弹性搜索:RequestError 400 parsing_exception
【发布时间】:2020-06-06 20:53:56
【问题描述】:

在尝试查询符合此条件的事件文档时,我遇到了解析异常,我不确定是什么原因造成的。这发生在我的自定义 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)])

【问题讨论】:

  • term后面的查询有问题。您能否在返回 qs 之前通过打印查询字符串来更新您的问题。
  • @Fenz242,该错误是由弹性搜索查询格式不正确引起的。能否请您更新查询字符串不像括号()类型。

标签: django elasticsearch django-rest-framework elasticsearch-dsl


【解决方案1】:

您的字符串查询应该是这样的:

{
  "bool": {
    "should":[
      "bool" : {
        "must":[

          {"match":{
          "visibility_scope" : 2

          },
          "bool":{
            "must":[
              {
                "terms": {

                }
                ....
                .....
                .....

              }
              ]
          }

          }
        ]
      } 
    ]



}

}

你能用查询字符串更新你的问题吗?我也许能够完成它。

【讨论】:

  • 是的,我打印了查询字符串还是你的意思是别的?
  • 您必须按照我在答案中提到的字符串格式编写查询。请查看 elasticsearch 关键字。所有这些都以较小的后来者开头,并且在查询中不应使用= 而应使用:
【解决方案2】:

这是因为查询集。请设置 flat=True。

user_universities = user.userprofile.universities.all().values_list("id", flat=True)

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2021-11-23
    • 2019-10-02
    • 1970-01-01
    • 2017-10-06
    • 2020-02-28
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多