Ich verwende Solr als Backend für Heuhaufen. Ich habe alle Vorbereitungsbefehle ausgeführt (generieren von schema.xml usw.), aber wenn ich versuche, die erste Suche durchzuführen, tritt eine Ausnahme auf.
Dies ist meine Python-Umgebung:
Django==1.8
django-filter==0.9.2
django-haystack==2.3.1
djangorestframework==3.1.1
Markdown==2.6.1
Pillow==2.8.1
psycopg2==2.6
pysolr==3.3.0
requests==2.6.0
Die Ausnahme, auf die ich stoße, ist diese:
'list' object has no attribute 'split'
Es scheint zu passieren, weil solr mit einer Liste für das django_ct-Feld antwortet, aber ich denke, haystack erwartet eine Zeichenfolge.
Dies ist der Stacktrace:
Environment:
Request Method: GET
Request URL: http://localhost:8000/api/1.0/p/products/?search=test
Django Version: 1.8
Python Version: 3.4.0
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.gis',
'rest_framework',
'rest_framework.authtoken',
'django_filters',
'haystack',
'deliveries',
'products',
'stores',
'users')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')
Traceback:
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
452. response = self.handle_exception(exc)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
449. response = handler(request, *args, **kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/generics.py" in get
199. return self.list(request, *args, **kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/mixins.py" in list
41. page = self.paginate_queryset(queryset)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/generics.py" in paginate_queryset
170. return self.paginator.paginate_queryset(queryset, self.request, view=self)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/rest_framework/pagination.py" in paginate_queryset
299. self.page = paginator.page(page_number)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/core/paginator.py" in page
50. number = self.validate_number(number)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/core/paginator.py" in validate_number
39. if number > self.num_pages:
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/core/paginator.py" in _get_num_pages
86. if self.count == 0 and not self.allow_empty_first_page:
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/django/core/paginator.py" in _get_count
77. self._count = len(self.object_list)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/query.py" in __len__
91. self._result_count = self.query.get_count()
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/backends/__init__.py" in get_count
626. self.run()
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/backends/solr_backend.py" in run
699. results = self.backend.search(final_query, **search_kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/backends/__init__.py" in wrapper
35. return func(obj, query_string, *args, **kwargs)
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/backends/solr_backend.py" in search
136. return self._process_results(raw_results, highlight=kwargs.get('highlight'), result_class=kwargs.get('result_class', SearchResult), distance_point=kwargs.get('distance_point'))
File "/home/nicolas/ding-dong/dingdong-django/venv34/lib/python3.4/site-packages/haystack/backends/solr_backend.py" in _process_results
374. app_label, model_name = raw_result[DJANGO_CT].split('.')
Exception Type: AttributeError at /api/1.0/p/products/
Exception Value: 'list' object has no attribute 'split'
Und das sind die lokalen Variablen als Ausnahme:
None
raw_results
<pysolr.Results object at 0x7fb8df0a64a8>
result_class
<class 'haystack.models.SearchResult'>
hits
1
unified_index
<haystack.utils.loading.UnifiedIndex object at 0x7fb8df1b0048>
raw_result
{'_version_': 1499926380381470720,
'categories': ['Category object'],
'description': ['Descripcion test'],
'django_ct': ['products.product'],
'django_id': [1],
'ean': [111],
'id': 'products.product.1',
'name': ['Producto test 1'],
'name_auto': ['Producto test 1'],
'score': 0.14093116,
'text': ['Producto test 1\n'
'111\n'
'\n'
' Categoria test\n'
'\n'
'Descripcion test\n'
'None']}
distance_point
None
stats
{}
indexed_models
[<class 'products.models.Product'>]
key
'fields'
spelling_suggestion
None
self
<haystack.backends.solr_backend.SolrSearchBackend object at 0x7fb8df24e748>
connections
<haystack.utils.loading.ConnectionHandler object at 0x7fb8ff447208>
results
[]
facets
{'dates': {}, 'fields': {}, 'queries': {}}
Wie Sie sehen, ist django_ct eine Liste, kein String.
Jede Hilfe wird geschätzt.
Die Abfrage, die ich mache, ist übrigens diese:
results = SearchQuerySet().filter(content=Clean(value)).models(Product)
Ich habe festgestellt, dass solr die generierte Datei schema.xml nicht verwendet. Jetzt beschwert sich Solr darüber:
test_shard1_replica1: org.apache.solr.common.Solr Exception:org.apache.solr.common.SolrException : Conf für Core konnte nicht geladen werden test_shard1_replica1: Plugin-Init-Fehler für [schema.xml] fieldType "sint": Fehler beim Laden der Klasse 'solr .SortierbaresIntField'. Die Schemadatei ist /configs/test/schema.xml
Ich habe das gleiche Problem auch. Ich hatte mich gefragt, ob sich die schema.xml im richtigen Verzeichnis befindet, obwohl ich mir nicht sicher war, wo ich sie sonst platzieren sollte. Ich hatte es unter 'server/solr/core_name_here/conf/' abgelegt und sah, dass das Protokoll mir sagte, dass es eine unerwartete schema.xml gab und dass ich sie entfernen sollte, da sie bereits verwaltet wurde oder ähnliches.
Ok, ich versuche seit Tagen, dieses Problem zu lösen, bin endlich auf den Grund gegangen. Siehe hier: http://stackoverflow.com/questions/30427643/fields-in-apache-solr-response-are-multivalued-when-they-should-be-singular/30484017#30484017
Haystack scheint nicht mit Solr v5.* kompatibel zu sein. Sobald Sie die obigen Anweisungen befolgen, um dieses Problem zu beheben, werden Sie auf ein Problem mit veralteten Klassen und Klassen stoßen, die vollständig aus Solr entfernt wurden, z. B. https://lucene.apache.org/solr/4_2_0/solr-core/ org/apache/solr/schema/SortableIntField.html.
Ich habe dies noch nicht versucht, aber ich würde vorschlagen, möglicherweise auf Solr v4.* oder vielleicht sogar auf v.3.5 gemäß den Dokumenten zurückzusetzen. Jemand sollte die Dokumentation aktualisieren, um dies widerzuspiegeln, und weitere Tests durchführen.
Wenn Sie mit Solr vertraut sind, können Sie alternativ versuchen, die schema.xml zu ändern, aber ich weiß nicht, ob Sie später auf andere Probleme stoßen werden.
Zugehöriges Ticket:
https://github.com/django-haystack/django-haystack/issues/1199
4.x wird definitiv unterstützt – alle Tests laufen gegen 4.7. @sampeka danke, dass
Schau dir meinen Kommentar zu #1183 an. Ich bin mir nicht sicher, ob Sie auf der ganzen Linie auf Probleme stoßen, aber ich habe einfach eine der standardmäßigen schema.xml verwendet und in die entsprechenden Django-Felder eingefügt, damit die Indizierung auf Solr 5.1 funktioniert. Sie müssen Felder nach Bedarf für Ihre spezifischen Modelle hinzufügen, aber das hat mich auf den Weg gebracht. Ich bin noch nicht so weit in der Django-App , aber diese hat rich_content_extraction, um zumindest Inhalte in meinen Index zu bekommen.
@nikolaz111 Ich habe ein paar Schritte herausgefunden, um diesen Fehler VORÜBERGEHEND zu beheben:
<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
<lst name="defaults">
<str name="df">_text_</str>
</lst>
</initParams>
ändern
<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell">
<lst name="defaults">
<str name="df">text</str>
</lst>
</initParams>
Hat jemand Solr 5 dazu gebracht, mit Haystack zu arbeiten?
Mir fällt ein Fehler nach dem anderen ein. Derzeit bei Error instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory'
für den Feldtyp text_general hängen geblieben.
Ich habe es derzeit in Betrieb. Meine größte Empfehlung für den Anfang ist, die standardmäßige Solr-Schema.xml zu verwenden und einfach die erforderlichen Django-Felder hinzuzufügen. Sie müssen id, django_ct, *_exact (ich habe es gerade als dynamisches Feld eingefügt) und vielleicht ein paar andere hinzufügen. Ich denke, es wird Ihnen viel Zeit sparen, anstatt andersherum zu gehen.
Ich habe aufgegeben und bin einfach bei dem "dynamischen" Schema geblieben, das Solr standardmäßig zu verwenden scheint.
Das scheint bei mir funktioniert zu haben https://github.com/nazariyg/Solr-5-for-django-haystack
Sieht positiv aus, werde ich ausprobieren und berichten.
Die Problemumgehung von @nazariyg funktioniert für mich. Was für Kopfschmerzen.
@nazariyg Welche Haystack & Django-Version verwenden Sie für Ihre Problemumgehung?
Ich bin auf Django 1.9.4 und habe Haystack 2.5 heruntergeladen, um Solr 5.5 unter Win zu versuchen
Vor Ihrem Workaround konnte ich keinen einzigen Treffer von Solr abrufen, jetzt stehe ich immer noch vor dem Problem
_'list'-Objekt hat kein Attribut 'split'_
geworfen von solr_backend.py in diesem Punkt
for raw_result in raw_results.docs:
app_label, model_name = raw_result[DJANGO_CT].split('.')
Bei der Integration mit SOLR6 musste ich zusätzliche Konfigurationen vornehmen. Ich habe die Schritte, die ich befolgt habe, im folgenden Link dokumentiert.
Wird es eine Lösung für das Problem geben? Kein Workaround.
Ich habe versucht, für alles die neuesten Versionen zu verwenden.
@dekanayake mach bitte einen pr.
Wird Haystack also jemals mit Solr 6 kompatibel sein?
@cauanicatro es ist schon eine Weile her. #1504 hat einige Updates für die Schema-Generierung abgeschlossen, aber ich betreibe es schon eine ganze Weile
Ich bin auch auf diesen Fehler gestoßen. so frustrierend
@wagaman Gibt es diesen Fehler immer noch?
@wagaman hast du einen reproduzierbaren testfall?
Danke für die Antworten. Ich habe slor 6. Ich habe eine Datenbank, in der ich rohes HTML sammle, sodass jede Zeile ziemlich groß ist. Wenn ich den Index neu generiere, sagt er "content", meine HTML-Zelle, ist zu groß. Ich habe online einem Tutorial gefolgt, um den Typ von strings in text_general zu ändern.
pysolr.SolrError: Solr responded with an error (HTTP 400): [Reason: Exception writing document id piaoyouquan.piaoyou.1003 to the index; possible analysis error: Document contains at least one immense term in field="content" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: '[60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 114, 105, 99, 104, 95, 109, 101, 100, 105, 97, 95, 97, 114, 101, 97, 95, 112, 114]...', original message: bytes can be at most 32766 in length; got 86946. Perhaps the document has an indexed string field (solr.StrField) which is too large]
Dann kann ich den Index generieren. Wenn ich jedoch versuche zu suchen, bekomme ich "'Listenobjekt hat kein Attribut 'Split'". Ich werde die Codes unten posten.
Attributfehler bei /search/
'list'-Objekt hat kein Attribut 'split'
Anfragemethode: GET
Anforderungs-URL: http://127.0.0.1 :8000/search/?q=w
Django-Version: 1.10
Ausnahmetyp: AttributeError
Ausnahmewert:
'list'-Objekt hat kein Attribut 'split'
Ort der Ausnahme: /Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py in _process_results, Zeile 406
Ausführbare Python-Datei: /Users/ja/3.5/bin/python
Python-Version: 3.5.1
Python-Pfad:
['/Users/ja/Dropbox/Programming/Django/piaoyou',
'/Users/ja/3.5/lib/python35.zip',
'/Benutzer/ja/3.5/lib/python3.5',
'/Users/ja/3.5/lib/python3.5/plat-darwin',
'/Users/ja/3.5/lib/python3.5/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5',
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin',
'/Users/ja/3.5/lib/python3.5/site-packages',
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
Serverzeit: Mo, 26. Juni 2017 05:01:18 +0000
Umfeld:
Anfragemethode: GET
Anforderungs-URL: http://127.0.0.1 :8000/search/?q=wDjango-Version: 1.10
Python-Version: 3.5.1
Installierte Anwendungen:
['dal',
'dal_select2',
'benutzerdefinierte_Vorlage',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'piaoyouquan',
'rest_framework',
'Bild nach unten',
'crispy_forms',
'taggit',
'taggit_templatetags2',
'Heuhaufen',
'rauschen',
'next_prev',
'django_extensions']
Installierte Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']Zurück verfolgen:
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" in count
- Rückgabe self.object_list.count()
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" in count
- zurück len(selbst)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" in __len__
- self._result_count = self.query.get_count()
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" in get_count
- self.run()
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in run
- Ergebnisse = self.backend.search(final_query, **search_kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" im Wrapper
- return func(obj, query_string, args, * kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in der Suche
- distance_point=kwargs.get('distance_point'))
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in _process_results
- app_label, model_name = raw_result[DJANGO_CT].split('.')
Bei der Behandlung der obigen Ausnahme ('list'-Objekt hat kein Attribut 'split') ist eine weitere Ausnahme aufgetreten:
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
- Antwort = get_response(Anfrage)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
- Antwort = self.process_exception_by_middleware(e, Anfrage)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
- Antwort = Wrapped_callback(request, callback_args, * callback_kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" in view
- return self.dispatch(request, args, * kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" im Versand
- Return-Handler(request, args, * kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" in get
- return self.form_valid(form)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" in form_valid
- 'object_list': self.queryset
Datei "/Users/ja/Dropbox/Programming/Django/piaoyou/piaoyouquan/views.py" in get_context_data
- context = super(BillSearchView, self).get_context_data( args, * kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" in get_context_data
- paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" in paginate_queryset
- page = paginator.page(page_number)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" in Seite
- Zahl = self.validate_number(Zahl)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" in valid_number
- wenn Zahl > self.num_pages:
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" in __get__
- res = Instanz.__dict__[self.name] = self.func(Instanz)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" in num_pages
- if self.count == 0 und nicht self.allow_empty_first_page:
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" in __get__
- res = Instanz.__dict__[self.name] = self.func(Instanz)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" in count
- Rückgabe von len(self.object_list)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" in __len__
- self._result_count = self.query.get_count()
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" in get_count
- self.run()
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in Run
- Ergebnisse = self.backend.search(final_query, **search_kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" im Wrapper
- return func(obj, query_string, args, * kwargs)
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in der Suche
- distance_point=kwargs.get('distance_point'))
Datei "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" in _process_results
- app_label, model_name = raw_result[DJANGO_CT].split('.')
Ausnahmetyp: AttributeError bei /search/
Ausnahmewert: 'list'-Objekt hat kein Attribut 'split'
Früher habe ich Whoosh mit Haystack verwendet, es hat mit dem gleichen Code in Django gut funktioniert.
Appium-Python-Client==0.24
schönesuppe4==4.4.1
Zykler==0.10.0
Django==1.10
django-autocomplete-light==3.2.7
django-classy-tags==0.8.0
django-crispy-forms==1.6.1
django-Erweiterungen==1.7.9
django-filter==1.0.4
django-heuhaufen==2.6.1
django-next-prev==1.0.1
django-pagedown==0,1.3
django-taggit==0.22.1
django-taggit-templatetags2==1.6.1
django-uuslug==1.1.8
djangorestframework==3.6.3
dnspython==1.15.0
EasyProcess==0.2.3
ez-Setup==0,9
fake-useragent==0.1.7
gevent==1.2.2
grün==0.4.12
Heuhaufen==0.36
jieba==0.38
lxml==3.6.0
Abschlag==2.6.8
matplotlib==2.0.0
numpy==1.11.0
olefile==0.44
Kissen==4.1.0
pydotplus==2.0.2
pyparsing==2.1.10
pytesseract==0.1.7
python-dateutil==2.6.0
python-slugify==1.2.4
pytz==2016.10
PyVirtualDisplay==0.2.1
regex==2016.4.25
Anfragen==2.9.1
scikit-lernen==0.18.1
scipy==0.19.0
Selen==3.4.3
sechs==1.10.0
sklearn==0.0
tesseract==0,1.3
tqdm==4.14.0
Unidecode==0.4.20
aktualisieren==0.4.4
Werkzeug==0.12.2
Whoosh==2.7.4
winappdbg==1.5
xvfbwrapper==0.2.9
Nach 3-4 Tagen erreichte ich die Lösung.
Lösung 1-: Änderung im Schema
Schritt 1: Gehen Sie zu Ihrer verwalteten Schemadatei für die Sammlung und bearbeiten Sie
Schritt 2: Suchen und ersetzen Sie <field name="django_ct" type="text_general"/>
durch <field name="django_ct" type="string"/>
Lösung 2: Kerndatei hacken
Schritt 1: sudo vim /home/your path/site-packages/haystack/backends/solr_backend.py
Schritt 2: Suchen und ersetzen Sie app_label, model_name = raw_result[DJANGO_CT].split('.')
durch app_label, model_name = raw_result[DJANGO_CT][0].split('.')
@acdha was ist damit?
Kann jemand, der dieses Problem reproduzieren kann, herausfinden, was seine Schemakonfiguration von der Standardeinstellung ändert? Haystack soll string
gemäß https://github.com/django-haystack/django-haystack/blob/9eb42dac5cd918c991ac7c939d6de81a02a1aba1/haystack/templates/search_configuration/schema.xml#L81 verwenden, aber es klingt wie mehrere Personen haben festgestellt, dass sie stattdessen zu text_general
werden.
@ krmritunjay11 kannst du es testen?
Ich hatte ein ähnliches Problem und habe die zweite Lösung ausprobiert, die @ krmritunjay11 oben gepostet hat, aber es hat immer noch nicht funktioniert. Derselbe Code und dieselbe Umgebung funktionierten mit Whoosh.
Meine aktuelle Umgebung ist:
Requirements.txt , und ich verwende Solr 7.3.1 (aber ich habe Solr 6.X ausprobiert und die gleichen Fehler erhalten)
Ich bekam folgenden Fehler:
File "<yourpath>/site-packages/django/db/models/fields/__init__.py", line 947, in get_prep_value
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Ich habe Zeile 947 in der obigen Datei geändert von
return int(value)
zu
if isinstance(value, list):
return int(value[0])
return int(value)
Dies führte zu einem weiteren Fehler:
File "<your path>/site-packages/haystack/query.py", line 181, in post_process_results
result.pk = result_klass(result.pk)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Was ich behoben habe, indem ich die Zeile 181 von geändert habe
result.pk = result_klass(result.pk)
zu
if isinstance(result.pk, list):
result.pk = result_klass(result.pk[0])
else:
result.pk = result_klass(result.pk)
Die Suche funktioniert jetzt, aber meine Lösung scheint hackig und nicht robust zu sein.
Haben Sie eine Idee, warum dies passieren könnte und ob es eine bessere Lösung gibt?
Ich habe eine andere Lösung gefunden, ohne die Kerndateien von django zu berühren.
In
result.pk = result_klass(result.pk)
Zu:
result.pk = result_klass(result.pk[0])
Und fügen Sie vor Zeile 205 Folgendes hinzu:
pks = [pk[0] for pk in pks]
Der try-Block endet also so:
207 try:
208 ui = connections[self.query._using].get_unified_index()
209 index = ui.get_index(model)
210 objects = index.read_queryset(using=self.query._using)
211 pks = [pk[0] for pk in pks]
212 return objects.in_bulk(pks)
Das funktionierte mit django 1.11, haystack 2.7.0 und solr 5.5.5
Hi.
Ich habe das gleiche Problem und habe Lösungen von anderen Kommentatoren kombiniert, um eine funktionierende Lösung zu finden. Das Gute daran ist, dass Sie SolrEngine überschreiben und Ihre feste Version verwenden können, bis sie im Heuhaufen behoben ist.
Ich verwende haystack 2.8.1 und solr 8.5.2.
Bearbeiten Sie die Datei haystack/backends/solr_backend.py, um zu überprüfen, ob sie für Sie funktioniert:
python
app_label, model_name = raw_result[DJANGO_CT].split('.')
python
app_label, model_name = raw_result[DJANGO_CT][0].split('.')
python
result = result_class(app_label, model_name, raw_result[DJANGO_ID], raw_result['score'], **additional_fields)
python
result = result_class(app_label, model_name, raw_result[DJANGO_ID][0], raw_result['score'], **additional_fields)
python
for key, value in raw_result.items():
value = value[0]
python
for key, value in raw_result.items():
if isinstance(value, list):
value = value[0]
Jede PR ist willkommen.
Jede PR ist willkommen.
Ja, aber ich fühle mich nicht kompetent genug, um eine vollständig praktikable Lösung vorzuschlagen. Meine Änderungen funktionieren für mich einwandfrei, aber ich habe nicht auf der niedrigeren Version der Solr-Engine getestet. Lohnt es sich noch eine PR zu erstellen?
Reproduzierbar mit django-haystack 3.0 und Solr 7.7.3
@jcrbsa Können Sie einen nicht bestandenen Test einreichen? Ich habe keine Möglichkeit das zu reproduzieren.
@acdha , folge diesen Schritten
Zeigen Sie nach der Abfrage per Formular den folgenden Fehler in solr_backend.py an:
C:\Python37\lib\site-packages\haystack\backends\solr_backend.py, Zeile 525, in _process_results
Zeigen Sie nach der Änderung in solr_backend.py und der neuen Abfrage per Formular den folgenden Fehler an:
C:\Python37\lib\site-packages\django\db\models\fields__init__.py, Zeile 1778, in get_prep_value
Das wird nicht reproduziert, wahrscheinlich weil ich ein Standard-Solr-Schema habe, das den erwarteten Typ verwendet. Können Sie einen nicht bestandenen Test vorlegen?
Hilfreichster Kommentar
Nach 3-4 Tagen erreichte ich die Lösung.
Lösung 1-: Änderung im Schema
Schritt 1: Gehen Sie zu Ihrer verwalteten Schemadatei für die Sammlung und bearbeiten Sie
Schritt 2: Suchen und ersetzen Sie
<field name="django_ct" type="text_general"/>
durch<field name="django_ct" type="string"/>
Lösung 2: Kerndatei hacken
Schritt 1: sudo vim /home/your path/site-packages/haystack/backends/solr_backend.py
Schritt 2: Suchen und ersetzen Sie
app_label, model_name = raw_result[DJANGO_CT].split('.')
durchapp_label, model_name = raw_result[DJANGO_CT][0].split('.')