Django-haystack: Ergebnisfenster zu groß

Erstellt am 18. Mai 2017  ·  14Kommentare  ·  Quelle: django-haystack/django-haystack

  • [x ] Getestet mit der neuesten Haystack-Version
  • [ ] Getestet mit dem aktuellen Haystack-Master-Zweig

Wenn ich den Update-Befehl mit der Option zum Entfernen ausführe:

python manage.py update_index -b 10000 --remove

Ich bekomme diese Ausnahme:

Fehler beim Abfragen von Elasticsearch mit ' : ': TransportError(500, u'search_phase_execution_exception', u'Ergebnisfenster ist zu groß, von + Größe muss kleiner oder gleich sein: [10000] war aber [20000]. Siehe Scroll-API für eine effizientere Möglichkeit, große Datensätze anzufordern. Diese Grenze kann durch Ändern des Parameters [index.max_result_window] Indexebene festgelegt werden.')

ABER die Losgröße beträgt nur 10000, wo liegt das Problem?

Aufbau

  • Betriebssystemversion: Ubuntu 16.04
  • Suchmaschinenversion: 2.4.1
  • Python-Version: 2.7
  • Django-Version: 1.10.5
  • Heuhaufen-Version: 2.6.0
awaiting reply needs test performance

Hilfreichster Kommentar

Ich habe gerade angefangen, eine ähnliche Fehlermeldung zu sehen, nachdem ich etwas mehr als 11000 Datensätze hochgeladen habe! Wie legen Sie max_result_window für den Index fest?

Alle 14 Kommentare

Passiert das bei einer kleineren Blockgröße?

Ich habe index.max_result_window auf 50000 gesetzt und einen kleineren Batch (6000) verwendet, ich habe diesen Fehler erhalten.

Fehler beim Abfragen von Elasticsearch mit ' : ': TransportError(500, u'search_phase_execution_exception', u'Ergebnisfenster ist zu groß, von + Größe muss kleiner oder gleich sein: [50000] war aber [56000]. Siehe Scroll-API für eine effizientere Möglichkeit, große Datensätze anzufordern. Diese Grenze kann durch Ändern des Parameters [index.max_result_window] Indexebene festgelegt werden.')

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html

Beachten Sie, dass from + size nicht größer sein kann als die Indexeinstellung index.max_result_window, die standardmäßig 10.000 beträgt. In der Scroll-API finden Sie effizientere Möglichkeiten für Deep Scrolling.

Ich versuche immer noch, eine Lösung dafür zu finden ... Die Paginierung wird also ohne zusätzliche Hacks effektiv durchgeführt.

Ich habe gerade einen brandneuen Server mit Elasticsearch 2.4.5 konfiguriert und sehe dies zeitweise, wenn Benutzer suchen. Manchmal werden die Ergebnisse zurückgegeben, manchmal erhalten sie diesen Fehler, selbst bei den gleichen Suchbegriffen. Dies ist die exakt gleiche Codebasis, außer dass auf dem alten Server Elasticsearch 1.4.0 ausgeführt wurde.

Kann ich etwas tun, um die Quelle zu finden?

Habe dieses Problem seit einiger Zeit und habe versucht, es zu untersuchen, aber ich habe nach einer Weile aufgehört.

Ich schlage vor, dass Benutzer, die mit diesem Problem konfrontiert sind, stattdessen einfach zum Solr-Backend wechseln sollten, das das Problem nicht zu haben scheint. (Bis das geklärt ist)

Ich habe gerade angefangen, eine ähnliche Fehlermeldung zu sehen, nachdem ich etwas mehr als 11000 Datensätze hochgeladen habe! Wie legen Sie max_result_window für den Index fest?

Gibt es hierzu Neuigkeiten? Dieses Problem habe ich auch noch.

Irgendwelche Neuigkeiten?

Nur um einen Traceback hinzuzufügen, da ich nur versuche, einige Indizes zu verwalten;

root<strong i="6">@32c6a37cff2c</strong>:/app# python manage.py update_index results -r -b 500 -v 2
Indexing 11734 Results
  indexed 1 - 500 of 11734 (worker PID: 2082).
  indexed 501 - 1000 of 11734 (worker PID: 2082).
  indexed 1001 - 1500 of 11734 (worker PID: 2082).
  indexed 1501 - 2000 of 11734 (worker PID: 2082).
  indexed 2001 - 2500 of 11734 (worker PID: 2082).
  indexed 2501 - 3000 of 11734 (worker PID: 2082).
  indexed 3001 - 3500 of 11734 (worker PID: 2082).
  indexed 3501 - 4000 of 11734 (worker PID: 2082).
  indexed 4001 - 4500 of 11734 (worker PID: 2082).
  indexed 4501 - 5000 of 11734 (worker PID: 2082).
  indexed 5001 - 5500 of 11734 (worker PID: 2082).
  indexed 5501 - 6000 of 11734 (worker PID: 2082).
  indexed 6001 - 6500 of 11734 (worker PID: 2082).
  indexed 6501 - 7000 of 11734 (worker PID: 2082).
  indexed 7001 - 7500 of 11734 (worker PID: 2082).
  indexed 7501 - 8000 of 11734 (worker PID: 2082).
  indexed 8001 - 8500 of 11734 (worker PID: 2082).
  indexed 8501 - 9000 of 11734 (worker PID: 2082).
  indexed 9001 - 9500 of 11734 (worker PID: 2082).
  indexed 9501 - 10000 of 11734 (worker PID: 2082).
  indexed 10001 - 10500 of 11734 (worker PID: 2082).
  indexed 10501 - 11000 of 11734 (worker PID: 2082).
  indexed 11001 - 11500 of 11734 (worker PID: 2082).
  indexed 11501 - 11734 of 11734 (worker PID: 2082).
Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [10500]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [10500]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
ERROR - 15:32:43 07-03-2019: elasticsearch_backend - Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [10500]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [10500]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')

Was macht haystack am Ende eines Updates? Die Ausgabe schlägt vor, dass das angeforderte Update in den angegebenen Batches abgeschlossen wurde, aber dann muss etwas anderes passieren, das fehlschlägt.

Außerdem verwenden wir AWS für das ES-Backend und sie unterstützen nicht das Ändern von max_result_window in einem Index von dem, was ich gelesen habe.

Nur um die Informationen dazu hinzuzufügen, ich sehe mir einen Fehler an, der von Wache protokolliert wurde, und es sieht so aus, als würde nur ein kleiner Abschnitt der Suchergebnisse angezeigt, aber ich kann mich irren.

Der Fehler ist also der bekannte;

TransportError(500, 'search_phase_execution_exception', 'Result window is too large, from + size must be less than or equal to: [10000] but was [17684]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')

Was kommt von dieser Suche;
https://github.com/django-haystack/django-haystack/blob/v2.6.1/haystack/backends/elasticsearch_backend.py#L521

search_kwargs für die sind (mehr oder weniger direkt von der Wache genommen);

{
    'from': 17675, 
    'query': {
        'filtered': {
            'filter': {"terms":{"django_ct":["results.result"]}}, 
            'query': {
                "query_string": {
                        "analyze_wildcard":"True",
                        "auto_generate_phrase_queries":"True",
                        "default_field":"'text'",
                        "default_operator":"'AND'",
                        "fuzzy_max_expansions":"50",
                        "fuzzy_min_sim":"0.5",
                        "query":"'(NOT (position:([* TO \"0\"]) AND enabled:(Y) AND slug:(\"the\\-slug\")'"
                }
            }
        }
    }
}

Das an kwargs übergebene search auch so aussehen, als ob size in den obigen search_kwargs .

```
{
'end_offset': 17684,
'Modelle': [

],
'result_class':,
'Sortieren nach': [
[
'Name',
'aufsteigen'
]
],
'start_offset': 17675
}

Ich habe also einen Index mit 3,1 Millionen Objekten aus einem Modell. Kürzlich wurden etwa 1.200 Objekte direkt aus der Datenbank entfernt, also übersprungene Signale zum Entfernen aus dem Index :(

Ich führe ES in AWS aus, daher gibt es keinen Zugriff auf Konfigurationsvariablen, sodass ich index.max_result_window nicht ändern kann.

Das Ausführen von update_index myapp.MyModel --remove scheint veraltete Objekte nicht zu entfernen, da dieser Fehler nach der Aktualisierung auftritt;

  indexed 3150001 - 3155000 of 3188192 (worker PID: 2610).
  indexed 3155001 - 3160000 of 3188192 (worker PID: 2610).
  indexed 3160001 - 3165000 of 3188192 (worker PID: 2610).
  indexed 3165001 - 3170000 of 3188192 (worker PID: 2610).
  indexed 3170001 - 3175000 of 3188192 (worker PID: 2610).
  indexed 3175001 - 3180000 of 3188192 (worker PID: 2610).
  indexed 3180001 - 3185000 of 3188192 (worker PID: 2610).
  indexed 3185001 - 3188192 of 3188192 (worker PID: 2610).
Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [15000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [15000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
ERROR Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [15000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [15000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
[INFO/MainProcess] process shutting down

Gegen einen Index mit weniger als 10000 Objekten hatte ich noch nie Probleme.

# python manage.py update_index news.LatestNews --remove -v 2
Indexing 405 News
  indexed 1 - 405 of 405 (worker PID: 2957).
[INFO/MainProcess] process shutting down
# 

Dies hat auch nichts mit der Aktualisierung von Objekten zu tun, denn wenn ich versuche, einen sehr bestimmten Zeitrahmen anzuvisieren, der keine Ergebnisse zum Aktualisieren findet, erhalte ich anscheinend immer noch den Fehler in der Entfernungsphase von update_index ;

# python manage.py update_index results.Results -v 2 --remove --start 2019-11-19T14:00 --end 2019-11-18T00:01
/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1430: RuntimeWarning: DateTimeField Results.modified received a naive datetime (2019-11-18 00:01:00) while time zone support is active.
  RuntimeWarning)
/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1430: RuntimeWarning: DateTimeField Results.modified received a naive datetime (2019-11-19 14:00:00) while time zone support is active.
  RuntimeWarning)
Indexing 0 Results
Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [11000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [11000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
ERROR Failed to query Elasticsearch using '*:*': TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [11000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py", line 524, in search
    _source=True)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 539, in search
    doc_type, '_search'), params=params, body=body)
  File "/usr/local/lib/python2.7/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 "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/usr/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 114, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
TransportError: TransportError(500, u'search_phase_execution_exception', u'Result window is too large, from + size must be less than or equal to: [10000] but was [11000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
[INFO/MainProcess] process shutting down
# 

Gibt es eine alternative Möglichkeit, Objekte zu entfernen? Vielleicht könnte ein Python, das Sie über einen benutzerdefinierten Verwaltungsbefehl ausführen können, alle IDs in der Datenbank abrufen und Objekte entfernen, die nicht mit diesen IDs übereinstimmen?

Ich habe so etwas vor langer Zeit aus ähnlichen Gründen geschrieben, was nützlich sein könnte. Es hat einige Arbeit, die erforderlich wäre, um allgemein nützlich zu sein, aber es könnte Ihnen etwas Zeit sparen:

https://gist.github.com/acdha/08d0a760221184bd84cf#file -sync_index-py

Super, danke Chris (@acdha)! Ich wollte mit dem Abschnitt zum Entfernen von update_index daher ist dies eine große Hilfe.
Das muss ich nächste Woche mal durchgehen. Wenn Sie sagen, dass es etwas Arbeit braucht, um nützlich zu sein, was macht es dann so wie es ist?

Im Grunde funktioniert es für mich in dem Projekt, wo ich es brauchte, aber es gibt ein paar Dinge, die verallgemeinert werden müssen – im Wesentlichen die beiden Importe aus dem Paket wdl und insbesondere diese Zeile:

https://gist.github.com/acdha/08d0a760221184bd84cf#file -sync_index-py-L44

(Ich denke, das könnte nur backend_names = list(haystack_connections.connections_info.keys()) )

Die beiden Iteratoren könnten jetzt wahrscheinlich auch durch etwas von more-itertools werden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

isaacpeka picture isaacpeka  ·  3Kommentare

mdf-github picture mdf-github  ·  8Kommentare

SacNaturalFoods picture SacNaturalFoods  ·  5Kommentare

omonte picture omonte  ·  3Kommentare

matclayton picture matclayton  ·  7Kommentare