【问题标题】:Django/Haystack error: elasticsearch.exceptions.RequestError: TransportError(400, 'parsing_exception',...)Django/Haystack 错误:elasticsearch.exceptions.RequestError: TransportError(400, 'parsing_exception',...)
【发布时间】:2016-12-28 11:38:55
【问题描述】:

我在我的 Django 项目中使用 elasticsearch 作为 haystack 的后端。如here 所述,我创建了搜索所需的一切。但是当我搜索时,我会使用 TransportError(400, 'parsing_exception', 'no [query] registered for [filtered]') 引发回溯错误。

我已经用谷歌搜索了这个问题。但是没有得到任何解决方案。我将不胜感激帮助我解决这个问题。

我的回溯:

Traceback (most recent call last):
  File "c:\python34\lib\site- packages\haystack\backends\elasticsearch_backend.py", line 524, in search
_source=True)
  File "c:\python34\lib\site-packages\elasticsearch\client\utils.py", line 71, in _wrapped
    return func(*args, params=params, **kwargs)
  File "c:\python34\lib\site-packages\elasticsearch\client\__init__.py", line 569, in search
    doc_type, '_search'), params=params, body=body)
 File "c:\python34\lib\site-packages\elasticsearch\transport.py", line 327, in perform_request
   status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "c:\python34\lib\site-packages\elasticsearch\connection\http_urllib3.py", line 124, in perform_request
    self._raise_error(response.status, raw_data)
  File "c:\python34\lib\site-packages\elasticsearch\connection\base.py", line 122, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400,  'parsing_exception', 'no [query] registered for [filtered]')
[28/Dec/2016 17:06:58]"GET /search/?q=code HTTP/1.1" 200 395

Update-1 : 降级到 elasticsearch==1.7.0 后的 TraceBack

GET /haystack/modelresult/_search?_source=true [status:400 request:0.001s]
Failed to query Elasticsearch using '(code)': TransportError(400, 'parsing_exception')
Traceback (most recent call last):
  File "c:\python34\lib\site-packages\haystack\backends\elasticsearch_backend.py", line 524, in search
_source=True)
  File "c:\python34\lib\site-packages\elasticsearch\client\utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "c:\python34\lib\site-packages\elasticsearch\client\__init__.py", line 527, in search
    doc_type, '_search'), params=params, body=body)
  File "c:\python34\lib\site-packages\elasticsearch\transport.py", line 307, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "c:\python34\lib\site-packages\elasticsearch\connection\http_urllib3.py", line 93, in perform_request
    self._raise_error(response.status, raw_data)
  File "c:\python34\lib\site-packages\elasticsearch\connection\base.py", line 105, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, 'parsing_exception')
[28/Dec/2016 17:58:50]"GET /search/?q=code HTTP/1.1" 200 395

【问题讨论】:

  • 你能写下搜索查询吗?我有同样的问题,无法解决。

标签: python django elasticsearch django-haystack


【解决方案1】:

没有为[过滤]注册[查询]

据我所知,您正在运行 ES 5.0,并且您正在发送一个 filtered 查询,该查询已在 ES 2.x 和 removed in ES 5.x 中被弃用。

您需要将其替换为 bool/filter query

如果你有这样的事情:

{
  "query": {
    "filtered": {
      "filter": {}
    }
  }
}

直接替换为

{
  "query": {
    "bool": {
      "filter": {}
    }
  }
}

【讨论】:

  • 感谢您的友好回答。我是使用 Django haystack 和 elasticsearch 的新手。我应该在哪里用我的索引中的 bool 替换过滤器。我在索引中找不到任何查询或过滤词。即使我尝试切换到 V2.4.0,它也会返回相同的错误。你能帮帮我吗!
  • 你需要将你的ES降级到1.7.5,因为ES 2 and 5 are not yet supported显然是Haystack。
  • 我按照你的建议降级了,但现在它抛出了同样的错误,除了没有为 [filtered] 注册 [query]')。
  • 这不太可能。如果你真的有 ES 1.7.5 运行,那么这个错误就不会被抛出。运行curl -XGET localhost:9200 会得到什么?
  • 酷,很高兴它有帮助!
【解决方案2】:

Elasticsearch 已弃用 filtered 查询。请改用bool

它对我有用。

【讨论】:

  • 我使用的是 elasticsearch 6 和 django-haystack 2.6.1。它仍然无法正常工作。我必须降级我的弹性搜索吗?另外我在哪里可以将过滤器替换为布尔值?
  • 我建议您检查版本以确保它们匹配。
  • 我将elasticsearch降级到5.0.1,并在相同版本的系统中安装了elasticsearch。但是当我 curl localhost:9200 时,它显示了 6.0.1 版本,但我已将其删除并重新安装了 5.0.1 版本
  • 我降级到 5.6.5 并且收到 elasticsearch.exceptions.RequestError: TransportError(400, 'parsing_exception', 'no [query] registered for [filtered]') 。我在哪里将该过滤器更改为布尔值?我不知道路径。你能帮我解决这个问题吗?
【解决方案3】:

根据haystack docs 修复此错误,您应该在设置中设置正确版本的 haystack 引擎后端。 对于 elasticsearch v 5.x.x,它将是

H_ENGINE = 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 2015-02-01
    • 2020-06-06
    • 1970-01-01
    • 2021-03-08
    • 2012-12-09
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多