Django-haystack: El uso de solr como backend falla en la primera búsqueda

Creado en 1 may. 2015  ·  41Comentarios  ·  Fuente: django-haystack/django-haystack

Estoy usando solr como backend para pajar. Hice todos los comandos de preparación (generando schema.xml, etc.) pero cuando intento hacer la primera búsqueda ocurre una excepción.

Este es mi entorno de Python:

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

La excepción que encuentro es esta:

'list' object has no attribute 'split'

Parece suceder porque solr responde con una lista para el campo django_ct, pero creo que haystack espera una cadena.

Este es el seguimiento de la pila:

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'

Y estas son las variables locales en la excepción:

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': {}}

Como puede ver, django_ct es una lista, no una cadena.

Se agradece cualquier ayuda.

solr highpriority

Comentario más útil

Después de 3-4 días llegué a la solución.

Solución 1: cambio de esquema

Paso 1: vaya al archivo de esquema administrado de su colección y edite
Paso 2: busque y reemplace <field name="django_ct" type="text_general"/> por <field name="django_ct" type="string"/>

  • Versión del sistema operativo: Ubuntu 14.04 LTS
  • Versión del motor de búsqueda: Solr 7.2.1
  • Versión de Python: 3.4.3
  • Versión de Django: 2.0
  • Versión del pajar: 2.8.0

Solución 2: piratear el archivo del núcleo

Paso 1: sudo vim / home / your path / site-packages / haystack / backends / solr_backend.py
Paso 2: busque y reemplace app_label, model_name = raw_result[DJANGO_CT].split('.') por app_label, model_name = raw_result[DJANGO_CT][0].split('.')

Todos 41 comentarios

Por cierto, la consulta que estoy haciendo es esta:

results = SearchQuerySet().filter(content=Clean(value)).models(Product)

Descubrí que solr no estaba usando el archivo schema.xml que se generó. Ahora Solr está cumpliendo con esto:

test_shard1_replica1: org.apache.solr.common.Solr Excepción: org.apache.solr.common.SolrException : No se pudo cargar conf para el núcleo test_shard1_replica1: Error de inicio del complemento para [schema.xml] fieldType "sint": Error al cargar la clase 'solr .SortableIntField '. El archivo de esquema es /configs/test/schema.xml

También tengo el mismo problema. Me preguntaba si el archivo schema.xml estaba en el directorio correcto, aunque no estaba seguro de dónde más colocarlo. Lo había colocado en 'server / solr / core_name_here / conf /' y vi que el registro me decía que había un schema.xml inesperado y que debería eliminarlo porque ya estaba siendo administrado o algo así.

Ok, he estado tratando de solucionar este problema durante días, finalmente llegué al fondo. Vea aquí: http://stackoverflow.com/questions/30427643/fields-in-apache-solr-response-are-multivalued-when-they-should-be-singular/30484017#30484017

Haystack no parece compatible con Solr v5. *. Una vez que siga las instrucciones anteriores para solucionar este problema, se encontrará con un problema con clases obsoletas y clases que se han eliminado por completo de Solr, como https://lucene.apache.org/solr/4_2_0/solr-core/ org / apache / solr / schema / SortableIntField.html.

No he intentado esto todavía, pero sugeriría quizás retroceder a Solr v4. * O tal vez incluso v.3.5 según los documentos. Alguien debería actualizar los documentos para reflejar esto y hacer más pruebas.

Alternativamente, si está familiarizado con Solr, podría intentar modificar el archivo schema.xml, pero no sé si se encontrará con otros problemas en el futuro.

Boleto relacionado:
https://github.com/django-haystack/django-haystack/issues/1199

4.x definitivamente es compatible: todas las pruebas se ejecutan en 4.7. @sampeka gracias por

Mira mi comentario sobre el n. ° 1183. No estoy seguro de si tiene problemas en el futuro, pero solo usé uno de los schema.xml predeterminados y lo pegué en los campos de Django apropiados para que la indexación funcione en Solr 5.1. Tendrá que agregar campos según sea necesario para sus modelos específicos, pero esto me ayudó a despegar. No estoy demasiado metido en la aplicación de Django , pero esto hizo que rich_content_extraction al menos incluyera contenido en mi índice.

@ nikolaz111 Descubrí algunos pasos para corregir este error TEMPORALMENTE:

  • en solrconfig.xml cambie el schemafactory predeterminado a la clase ClassicIndexSchemaFactory
  • para la clase initParams:
<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
    <lst name="defaults">
      <str name="df">_text_</str>
    </lst>
  </initParams>

cambiar a

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell">
            <lst name="defaults">
            <str name="df">text</str>
            </lst>
</initParams>
  • ejecutar mange.py rebuild_index
  • dado que sobrescribimos schema.xml en el núcleo, evite usar ManagedIndexSchemaFactory, muchas clases en solrconfig.xml no serán llamadas. hay un xml que estoy usando ahora, espero que a alguien le interese
    https://gist.github.com/DrChai/033604cd04c869f40ade

¿Alguien consiguió que Solr 5 trabajara con Haystack?

Me encuentro con un error tras otro. Actualmente atascado en Error instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory' para el tipo de campo text_general.

Lo tengo funcionando actualmente. Mi mayor recomendación para comenzar es usar el esquema.xml de Solr predeterminado y simplemente agregar los campos necesarios de Django. Deberá agregar id, django_ct, * _exact (lo acabo de incluir como un campo dinámico) y tal vez algunos otros. Creo que le ahorrará mucho tiempo en lugar de ir al revés.

Me di por vencido y me quedé con el esquema "dinámico" que Solr parece tener por defecto.

Esto parece haber funcionado para mí https://github.com/nazariyg/Solr-5-for-django-haystack

Parece positivo, lo intentaré e informaré.

La solución de @nazariyg funciona para mí. que dolor de cabeza.

@nazariyg ¿Qué versión de Haystack & Django estás usando con tu solución?
Estoy en Django 1.9.4 y descargué Haystack 2.5 probando Solr 5.5 en Win
Antes de su solución alternativa, no podía recuperar un solo golpe de Solr, ahora sigo enfrentando el problema

El objeto _'list 'no tiene atributo' split'_

arrojado por solr_backend.py en este punto

  for raw_result in raw_results.docs:
            app_label, model_name = raw_result[DJANGO_CT].split('.') 

Tuve que hacer configuraciones adicionales al integrarme con SOLR6. He documentado los pasos que seguí en el siguiente enlace.

https://github.com/dekanayake/haystack_solr6

¿Habrá una solución al problema? No es una solución.
He intentado utilizar las últimas versiones para todo.

@dekanayake haz una pr por favor.

Entonces, ¿Haystack alguna vez será compatible con Solr 6?

@cauanicastro lo ha sido por un tiempo. # 1504 terminó algunas actualizaciones para la generación de esquemas, pero lo he estado ejecutando durante bastante tiempo

También me he encontrado con este error. muy frustrante

@wagaman ¿ Todavía existe este error?

@wagaman , ¿tienes un caso de prueba reproducible?

Gracias por las respuestas. Tengo slor 6. Tengo una base de datos donde recopilo HTML sin procesar, por lo que cada fila es bastante grande. Cuando regenero el índice, dice "contenido", mi celda HTML, es demasiado grande. Seguí un tutorial en línea para cambiar el tipo de cadenas a text_general.

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]

Entonces, puedo generar el índice. Sin embargo, cuando trato de buscar, obtuve "el objeto 'lista' no tiene ningún atributo 'dividir'". Publicaré los códigos a continuación.

AttributeError en / search /
El objeto 'lista' no tiene atributo 'dividir'
Método de solicitud: OBTENER
URL de solicitud: http://127.0.0.1 : 8000 / search /? Q = w
Versión de Django: 1.10
Tipo de excepción: AttributeError
Valor de excepción:
El objeto 'lista' no tiene atributo 'dividir'
Ubicación de excepción: /Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py en _process_results, línea 406
Ejecutable de Python: /Users/ja/3.5/bin/python
Versión de Python: 3.5.1
Ruta de Python:
['/ Users / ja / Dropbox / Programming / Django / piaoyou',
'/Users/ja/3.5/lib/python35.zip',
'/Users/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']
Hora del servidor: lun, 26 de junio de 2017 05:01:18 +0000

Medio ambiente:

Método de solicitud: OBTENER
URL de solicitud: http://127.0.0.1 : 8000 / search /? Q = w

Versión de Django: 1.10
Versión de Python: 3.5.1
Aplicaciones instaladas:
['dal',
'dal_select2',
'plantilla_personalizada',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'piaoyouquan',
'rest_framework',
'Página abajo',
'crispy_forms',
'taggit',
'taggit_templatetags2',
'alpaca',
'whoosh',
'next_prev',
'django_extensions']
Middleware instalado:
['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']

Rastrear:

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" en recuento

  1. return self.object_list.count ()

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" en recuento

  1. return len (yo)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" en __len__

  1. self._result_count = self.query.get_count ()

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" en get_count

  1. self.run ()

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en ejecución

  1. resultados = self.backend.search (consulta_final, ** kwargs_búsqueda)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" en contenedor

  1. return func (obj, query_string, args, * kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en la búsqueda

  1. punto_distancia = kwargs.get ('punto_distancia'))

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en _process_results

  1. app_label, model_name = raw_result [DJANGO_CT] .split ('.')

Durante el manejo de la excepción anterior (el objeto 'lista' no tiene ningún atributo 'dividir'), se produjo otra excepción:

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/exception.py" en el interior

  1. respuesta = get_response (solicitud)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" en _get_response

  1. respuesta = self.process_exception_by_middleware (e, solicitud)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" en _get_response

  1. response = wrap_callback (solicitud, callback_args, * callback_kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" a la vista

  1. return self.dispatch (solicitud, argumentos , * kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" en el envío

  1. controlador de retorno (solicitud, argumentos , * kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" en get

  1. return self.form_valid (formulario)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" en form_valid

  1. 'lista_objetos': self.queryset

Archivo "/Users/ja/Dropbox/Programming/Django/piaoyou/piaoyouquan/views.py" en get_context_data

  1. context = super (BillSearchView, self) .get_context_data (argumentos , * kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" en get_context_data

  1. paginator, page, queryset, is_paginated = self.paginate_queryset (queryset, page_size)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" en paginate_queryset

  1. page = paginator.page (page_number)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" en la página

  1. número = self.validate_number (número)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" en validate_number

  1. if número> self.num_pages:

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" en __get__

  1. res = instancia .__ dict __ [self.name] = self.func (instancia)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" en num_pages

  1. if self.count == 0 y no self.allow_empty_first_page:

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" en __get__

  1. res = instancia .__ dict __ [self.name] = self.func (instancia)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" en recuento

  1. return len (self.object_list)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" en __len__

  1. self._result_count = self.query.get_count ()

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" en get_count

  1. self.run ()

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en ejecución

  1. resultados = self.backend.search (consulta_final, ** kwargs_búsqueda)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" en contenedor

  1. return func (obj, query_string, args, * kwargs)

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en la búsqueda

  1. punto_distancia = kwargs.get ('punto_distancia'))

Archivo "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" en _process_results

  1. app_label, model_name = raw_result [DJANGO_CT] .split ('.')

Tipo de excepción: AttributeError en / search /
Valor de excepción: el objeto 'lista' no tiene atributo 'dividir'

Solía ​​usar Whoosh con Haystack, funcionaba bien con el mismo código en Django.

Appium-Python-Client == 0.24
beautifulsoup4 == 4.4.1
ciclador == 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-extensions == 1.7.9
filtro-django == 1.0.4
django-pajar == 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
greenlet == 0.4.12
pajar == 0.36
jieba == 0.38
lxml == 3.6.0
Markdown == 2.6.8
matplotlib == 2.0.0
numpy == 1.11.0
olefile == 0.44
Almohada == 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
expresión regular == 2016.4.25
solicitudes == 2.9.1
scikit-learn == 0.18.1
scipy == 0.19.0
selenio == 3.4.3
seis == 1.10.0
sklearn == 0.0
tesseract == 0.1.3
tqdm == 4.14.0
Unidecode == 0.4.20
actualización == 0.4.4
Werkzeug == 0.12.2
Whoosh == 2.7.4
winappdbg == 1.5
xvfbwrapper == 0.2.9

Después de 3-4 días llegué a la solución.

Solución 1: cambio de esquema

Paso 1: vaya al archivo de esquema administrado de su colección y edite
Paso 2: busque y reemplace <field name="django_ct" type="text_general"/> por <field name="django_ct" type="string"/>

  • Versión del sistema operativo: Ubuntu 14.04 LTS
  • Versión del motor de búsqueda: Solr 7.2.1
  • Versión de Python: 3.4.3
  • Versión de Django: 2.0
  • Versión del pajar: 2.8.0

Solución 2: piratear el archivo del núcleo

Paso 1: sudo vim / home / your path / site-packages / haystack / backends / solr_backend.py
Paso 2: busque y reemplace app_label, model_name = raw_result[DJANGO_CT].split('.') por app_label, model_name = raw_result[DJANGO_CT][0].split('.')

@acdha ¿qué pasa con esto?

¿Puede alguien que tenga la capacidad de reproducir este problema averiguar qué es lo que está cambiando la configuración predeterminada de su esquema? Se supone que Haystack usa string según https://github.com/django-haystack/django-haystack/blob/9eb42dac5cd918c991ac7c939d6de81a02a1aba1/haystack/templates/search_configuration/schema.xml# han descubierto que convertirse en text_general lugar.

@ krmritunjay11 ¿puedes probarlo?

Tuve un problema similar y probé la segunda solución que @ krmritunjay11 publicó anteriormente, pero aún así no funcionó. El mismo código y entorno funcionó con Whoosh.

Mi entorno actual es:
requirements.txt , y estoy usando Solr 7.3.1 (pero probé Solr 6.X y estaba obteniendo los mismos errores)

Recibí el siguiente error:

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'

Cambié la línea 947 en el archivo anterior de

 return int(value)

para

 if isinstance(value, list):
     return int(value[0])
 return int(value)

Esto creó otro error:

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'

Con el que arreglé cambiando la línea 181 de

 result.pk = result_klass(result.pk)

para

 if isinstance(result.pk, list):
    result.pk = result_klass(result.pk[0])
 else:
   result.pk = result_klass(result.pk)

La búsqueda ahora funciona, pero mi solución parece hacky y no robusta.

¿Alguna idea de por qué podría estar sucediendo esto y si hay una solución mejor?

Encontré otra solución sin tocar los archivos principales de django.

En/site-packages/haystack/query.py, cambie la línea 181 de:

result.pk = result_klass(result.pk)

Para:

result.pk = result_klass(result.pk[0])

Y agregue lo siguiente antes de la línea 205:

pks = [pk[0] for pk in pks]

Entonces, el bloque try termina así:

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)

Eso funcionó usando django 1.11, haystack 2.7.0 y solr 5.5.5

Hola.

Tengo el mismo problema y combinando soluciones de otros comentaristas logré encontrar una solución que funcione. Lo bueno es que puede anular SolrEngine y usar su versión fija hasta que se arregle en el pajar.

Estoy usando pajar 2.8.1 y solr 8.5.2.

Edite el archivo haystack / backends / solr_backend.py para verificar si funciona para usted:

  • Encontrar y reemplazar
    python app_label, model_name = raw_result[DJANGO_CT].split('.')
    para
    python app_label, model_name = raw_result[DJANGO_CT][0].split('.')
  • Encontrar y reemplazar
    python result = result_class(app_label, model_name, raw_result[DJANGO_ID], raw_result['score'], **additional_fields)
    para
    python result = result_class(app_label, model_name, raw_result[DJANGO_ID][0], raw_result['score'], **additional_fields)
  • Encontrar y reemplazar
    python for key, value in raw_result.items(): value = value[0]
    para
    python for key, value in raw_result.items(): if isinstance(value, list): value = value[0]

Todas las relaciones públicas son bienvenidas.

Todas las relaciones públicas son bienvenidas.

Sí, pero no me siento lo suficientemente competente como para proponer una solución completamente viable. Mis cambios funcionan perfectamente bien, pero no probé en la versión inferior del motor Solr. ¿Todavía vale la pena crear un PR?

Reproducible usando django-haystack 3.0 y Solr 7.7.3

@jcrbsa ¿Puede enviar una prueba fallida? No tengo forma de reproducir esto.

@acdha , sigue estos pasos

Después de la consulta por formulario, muestre el siguiente error en solr_backend.py:
C: \ Python37 \ lib \ site-packages \ haystack \ backends \ solr_backend.py, línea 525, en _process_results

Después del cambio en solr_backend.py y la nueva consulta por formulario, muestra el siguiente error:
C: \ Python37 \ lib \ site-packages \ django \ db \ models \ fields__init __. Py, línea 1778, en get_prep_value

Eso no se reproduce, probablemente porque tengo un esquema Solr estándar que usa el tipo esperado. ¿Puede proporcionar una prueba fallida?

¿Fue útil esta página
0 / 5 - 0 calificaciones