Django/Haystack错误:elasticsearch.exceptions.RequestError:TransportError(400,'parsing_exception',...)

sum*_*nth 7 python django django-haystack elasticsearch

我在我的Django项目中使用elasticsearch作为haystack的后端.我创建了一个搜索如前所述所需的一切在这里.但是当我搜索时,我会抛出TransportError错误(400,'parsing_exception','no [query]注册[filtered]').

我已经用Google搜索了这个问题.但是没有得到任何解决方案.我很乐意帮助我解决这个问题.

我的追溯:

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
Run Code Online (Sandbox Code Playgroud)

更新-1:TraceBack降级为elasticsearch == 1.7.0后

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
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 4

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

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

您需要将其替换为bool/filter查询

所以如果你有这样的事情:

{
  "query": {
    "filtered": {
      "filter": {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

只需将其替换为

{
  "query": {
    "bool": {
      "filter": {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要将 ES 降级到 [1.7.5](https://www.elastic.co/downloads/past-releases/elasticsearch-1-7-5),因为 [ES 2 和 5 尚不支持](https ://github.com/django-haystack/django-haystack/issues/1465)显然是 Haystack 的。 (2认同)