Django-haystack: Menggunakan solr sebagai backend gagal pada pencarian pertama

Dibuat pada 1 Mei 2015  ·  41Komentar  ·  Sumber: django-haystack/django-haystack

Saya menggunakan solr sebagai backend untuk tumpukan jerami. Saya melakukan semua perintah persiapan (menghasilkan schema.xml, dll) tetapi ketika saya mencoba melakukan pencarian pertama, pengecualian terjadi.

Ini adalah lingkungan python saya:

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

Pengecualian yang saya temui adalah ini:

'list' object has no attribute 'split'

Tampaknya terjadi karena solr merespons dengan daftar untuk bidang Django_ct tapi saya pikir tumpukan jerami mengharapkan sebuah string.

Ini adalah jejak tumpukan:

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'

Dan ini adalah variabel lokal dengan pengecualian:

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

Seperti yang Anda lihat, Django_ct adalah daftar, bukan string.

Bantuan apa pun dihargai.

solr highpriority

Komentar yang paling membantu

Setelah 3-4 hari saya mencapai solusi.

Solusi 1-: Perubahan skema

Langkah1: Buka file skema terkelola koleksi Anda dan edit
Langkah2 : Temukan dan ganti <field name="django_ct" type="text_general"/> menjadi <field name="django_ct" type="string"/>

  • Versi sistem operasi: Ubuntu 14.04 LTS
  • Versi mesin pencari: Solr 7.2.1
  • Versi Python: 3.4.3
  • Versi Django: 2.0
  • Versi tumpukan jerami: 2.8.0

Solusi 2-: Retas file inti

Langkah1: sudo vim /home/path Anda/site-packages/haystack/backends/solr_backend.py
Langkah2: Temukan dan ganti app_label, model_name = raw_result[DJANGO_CT].split('.') menjadi app_label, model_name = raw_result[DJANGO_CT][0].split('.')

Semua 41 komentar

Omong-omong, kueri yang saya lakukan adalah ini:

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

Saya menemukan bahwa solr tidak menggunakan file schema.xml yang dihasilkan. Sekarang Solr mengeluh tentang ini:

test_shard1_replica1: org.apache.solr.common.Solr Pengecualian:org.Apache.solr.common.SolrException : Tidak dapat memuat conf untuk inti test_shard1_replica1: Kegagalan init plugin untuk [schema.xml] fieldType "sint": Kesalahan memuat kelas 'solr .SortableIntField'. File skema adalah /configs/test/schema.xml

Saya mengalami masalah yang sama juga. Saya bertanya-tanya apakah schema.xml berada di direktori yang benar, meskipun saya tidak yakin di mana lagi harus meletakkannya. Saya telah meletakkannya di bawah 'server/solr/core_name_here/conf/' dan melihat bahwa log memberi tahu saya bahwa ada schema.xml yang tidak terduga dan saya harus menghapusnya karena sudah dikelola atau semacamnya.

Ok saya sudah mencoba untuk mengurutkan masalah ini selama berhari-hari, akhirnya sampai ke dasarnya. Lihat di sini: http://stackoverflow.com/questions/30427643/fields-in-Apache-solr-response-are-multivalued-when-they-should-be-singular/30484017#30484017

Haystack tampaknya tidak kompatibel dengan Solr v5.*. Setelah Anda mengikuti petunjuk di atas untuk memperbaiki masalah ini, Anda akan mengalami masalah dengan kelas usang dan kelas yang telah dihapus langsung dari Solr, seperti https://lucene.Apache.org/solr/4_2_0/solr-core/ org/Apache/solr/schema/SortableIntField.html.

Saya belum mencoba ini tetapi saya akan menyarankan mungkin memutar kembali ke Solr v4.* atau bahkan mungkin v.3.5 sesuai dengan dokumen. Seseorang harus memperbarui dokumen untuk mencerminkan hal ini dan melakukan pengujian lebih lanjut.

Atau jika Anda sudah familiar dengan Solr Anda bisa mencoba untuk mengubah schema.xml, tapi saya tidak tahu apakah Anda akan mengalami masalah lain di telepon.

Tiket Terkait:
https://github.com/django-haystack/django-haystack/issues/1199

4.x pasti didukung – semua pengujian berjalan melawan 4.7. @sampelka terima kasih telah menggali ini. Ini terlihat seperti #1200 juga.

Lihat komentar saya di #1183. Saya tidak yakin jika Anda mengalami masalah di telepon, tetapi saya hanya menggunakan salah satu dari schema.xml default dan menempelkan di bidang Django yang sesuai agar pengindeksan bekerja pada Solr 5.1. Anda harus menambahkan bidang yang diperlukan untuk model spesifik Anda, tetapi ini membuat saya keluar dari tanah. Saya tidak terlalu jauh ke dalam aplikasi Django , tetapi ini mendapat rich_content_extraction untuk setidaknya memasukkan konten ke dalam indeks saya.

@nikolaz111 Saya menemukan beberapa langkah untuk memperbaiki bug ini SEMENTARA :

  • di solrconfig.xml ubah schemafactory default ke class ClassicIndexSchemaFactory
  • untuk kelas initParams:
<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
    <lst name="defaults">
      <str name="df">_text_</str>
    </lst>
  </initParams>

mengubah

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell">
            <lst name="defaults">
            <str name="df">text</str>
            </lst>
</initParams>
  • jalankan mange.py rekondisi_index
  • karena kita menimpa schema.xml ke inti, hindari menggunakan ManagedIndexSchemaFactory, banyak kelas di solrconfig.xml tidak akan dipanggil. ada xml yang saya gunakan sekarang, saya harap seseorang akan tertarik
    https://Gist.github.com/DrChai/033604cd04c869f40ade

Adakah yang mendapatkan Solr 5 untuk bekerja dengan Haystack?

Saya mengalami kesalahan satu demi satu. Saat ini macet di Error instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory' untuk jenis bidang text_general.

Saya memilikinya bekerja saat ini. Rekomendasi terbesar saya untuk memulai adalah dengan menggunakan skema default Solr.xml dan cukup tambahkan bidang Django yang diperlukan. Anda perlu menambahkan id, Django_ct, *_exact (saya baru saja memasukkannya sebagai bidang dinamis) dan mungkin beberapa lainnya. Saya pikir itu akan menghemat banyak waktu daripada sebaliknya.

Saya menyerah, dan hanya terjebak dengan skema "dinamis" yang tampaknya menjadi default Solr.

Ini sepertinya berhasil untuk saya https://github.com/nazariyg/Solr-5-for-Django-haystack

Terlihat positif, saya akan mencobanya dan melaporkan kembali.

Solusi @nazariyg bekerja untuk saya. apa sakit kepala.

@nazariyg versi Haystack & Django mana yang Anda gunakan dengan solusi Anda?
Saya menggunakan Django 1.9.4 dan mengunduh Haystack 2.5 mencoba Solr 5.5 di Win
Sebelum solusi Anda, saya tidak dapat mengambil satu pukulan pun dari Solr, sekarang saya masih menghadapi masalah

objek _'list' tidak memiliki atribut 'split'_

dilempar oleh solr_backend.py pada titik ini

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

Saya harus melakukan konfigurasi tambahan saat berintegrasi dengan SOLR6 . Saya telah mendokumentasikan langkah-langkah yang saya ikuti di tautan berikut.

https://github.com/dekanayake/haystack_solr6

Apakah akan ada solusi untuk masalah tersebut? Bukan solusi.
Saya telah mencoba menggunakan versi terbaru untuk semuanya.

@dekanayake buat

Jadi, apakah Haystack akan kompatibel dengan Solr 6?

@cauanicastro sudah lama. #1504 menyelesaikan beberapa pembaruan untuk pembuatan skema tetapi saya telah menjalankannya cukup lama

Saya juga mengalami bug ini. sangat membuat frustrasi

@wagaman Masih ada bug ini?

@wagaman apakah Anda memiliki testcase yang dapat direproduksi?

Terima kasih atas balasannya. Saya memiliki slor 6. Saya memiliki database tempat saya mengumpulkan HTML mentah sehingga setiap baris cukup besar. Ketika saya membuat ulang indeks, dikatakan " konten ", sel HTML saya, terlalu besar. Saya mengikuti tutorial online untuk mengubah jenis dari string menjadi 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]

Kemudian, saya dapat menghasilkan file index. Namun, ketika saya mencoba mencari, saya mendapatkan "objek 'daftar' tidak memiliki atribut 'split'". Saya akan memposting kode di bawah ini.

AttributeError di /search/
objek 'list' tidak memiliki atribut 'split'
Metode Permintaan: DAPATKAN
URL Permintaan: http://127.0.0.1 :8000/search/?q=w
Versi Django: 1.10
Jenis Pengecualian: AttributeError
Nilai Pengecualian:
objek 'list' tidak memiliki atribut 'split'
Lokasi Pengecualian: /Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py di _process_results, baris 406
Python Dapat Dieksekusi: /Users/ja/3.5/bin/python
Versi Python: 3.5.1
Jalur Python:
['/Pengguna/ja/Dropbox/Pemrograman/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']
Waktu server: Sen, 26 Jun 2017 05:01:18 +0000

Lingkungan:

Metode Permintaan: DAPATKAN
URL Permintaan: http://127.0.0.1 :8000/search/?q=w

Versi Django: 1.10
Versi Python: 3.5.1
Aplikasi yang Diinstal:
['dal',
'dal_select2',
'templat_kustom',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'piaoyouquan',
'rest_framework',
'halaman bawah',
'renyah_forms',
'tag',
'taggit_templatetags2',
'tumpukan jerami',
'suara mendesing',
'berikutnya_sebelumnya',
'django_extensions']
Middleware yang diinstal:
['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']

Melacak kembali:

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/paginator.py" dalam hitungan

  1. kembalikan self.object_list.count()

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" dalam hitungan

  1. kembali len (diri)

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

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

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

  1. diri.run()

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" sedang dijalankan

  1. hasil = self.backend.search(final_query, **search_kwargs)

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" dalam pembungkus

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

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" dalam pencarian

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

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

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

Selama penanganan pengecualian di atas (objek 'daftar' tidak memiliki atribut 'split'), pengecualian lain terjadi:

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/handlers/exception.py" di dalam

  1. tanggapan = get_response(permintaan)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/handlers/base.py" di _get_response

  1. respon = self.process_exception_by_middleware(e, permintaan)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/handlers/base.py" di _get_response

  1. respon = dibungkus_callback(permintaan, callback_args, * callback_kwargs)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/views/generic/base.py" dalam tampilan

  1. kembalikan self.dispatch(permintaan, argumen, * kwargs)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/views/generic/base.py" dalam pengiriman

  1. kembali handler(permintaan, args, * kwargs)

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

  1. kembalikan self.form_valid(form)

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

  1. 'object_list': self.queryset

File "/Users/ja/Dropbox/Programming/Django/piaoyou/piaoyouquan/views.py" di get_context_data

  1. konteks = super(BillSearchView, self).get_context_data( args, * kwargs)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/views/generic/list.py" di get_context_data

  1. paginator, halaman, queryset, is_pagination = self.paginate_queryset(queryset, page_size)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/views/generic/list.py" di paginate_queryset

  1. halaman = paginator.page(nomor_halaman)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/paginator.py" di halaman

  1. nomor = self.validate_number(nomor)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/paginator.py" di nomor_validasi

  1. jika nomor > self.num_pages:

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/utils/functional.py" di __get__

  1. res = instance.__dict__[self.name] = self.func(instance)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/paginator.py" di num_pages

  1. jika self.count == 0 dan bukan self.allow_empty_first_page:

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/utils/functional.py" di __get__

  1. res = instance.__dict__[self.name] = self.func(instance)

File "/Users/ja/3.5/lib/python3.5/site-packages/Django/core/paginator.py" dalam hitungan

  1. kembali len(self.object_list)

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

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

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

  1. diri.run()

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" sedang dijalankan

  1. hasil = self.backend.search(final_query, **search_kwargs)

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" dalam pembungkus

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

File "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" dalam pencarian

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

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

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

Jenis Pengecualian: AttributeError di /search/
Nilai Pengecualian: objek 'daftar' tidak memiliki atribut 'split'

Saya dulu menggunakan Whoosh dengan Haystack, itu bekerja dengan baik dengan kode yang sama di Django.

Appium-Python-Klien==0.24
sup indah4==4.4.1
pengendara sepeda == 0.10.0
Django== 1.10
Django-autocomplete-light==3.2.7
django-classy-tags==0.8.0
Django-crispy-forms==1.6.1
ekstensi-django==1.7.9
filter-django==1.0.4
django-haystack==2.6.1
django-berikutnya-sebelumnya == 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
Proses Mudah==0.2.3
ez-pengaturan == 0.9
agen pengguna palsu == 0.1.7
acara = 1.2.2
hijau = 0.4.12
tumpukan jerami==0.36
jieba==0.38
lxml==3.6.0
Penurunan harga == 2.6.8
matplotlib==2.0.0
numpy == 1.11.0
olefile == 0,44
Bantal = 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
permintaan == 2.9.1
scikit-belajar == 0.18.1
scipy==0.19.0
selenium==3.4.3
enam == 1.10.0
sklearn==0.0
tesseract == 0.1.3
tqdm== 4.14.0
Undecode== 0.4.20
pembaruan == 0.4.4
Werkzeug==0.12.2
Whoosh == 2.7.4
winappdbg==1.5
xvfbwrapper==0.2.9

Setelah 3-4 hari saya mencapai solusi.

Solusi 1-: Perubahan skema

Langkah1: Buka file skema terkelola koleksi Anda dan edit
Langkah2 : Temukan dan ganti <field name="django_ct" type="text_general"/> menjadi <field name="django_ct" type="string"/>

  • Versi sistem operasi: Ubuntu 14.04 LTS
  • Versi mesin pencari: Solr 7.2.1
  • Versi Python: 3.4.3
  • Versi Django: 2.0
  • Versi tumpukan jerami: 2.8.0

Solusi 2-: Retas file inti

Langkah1: sudo vim /home/path Anda/site-packages/haystack/backends/solr_backend.py
Langkah2: Temukan dan ganti app_label, model_name = raw_result[DJANGO_CT].split('.') menjadi app_label, model_name = raw_result[DJANGO_CT][0].split('.')

@acdha ada apa ini?

Dapatkah seseorang yang memiliki kemampuan untuk mereproduksi masalah ini mencari tahu apa yang mengubah konfigurasi skema mereka dari default? Haystack seharusnya menggunakan string sesuai https://github.com/django-haystack/django-haystack/blob/9eb42dac5cd918c991ac7c939d6de81a02a1aba1/haystack/templates/search_configuration/schema.xml#L81 tetapi kedengarannya seperti banyak orang telah menemukan bahwa menjadi text_general sebagai gantinya.

@krmritunjay11 dapatkah Anda mengujinya?

Saya memiliki masalah serupa dan saya mencoba solusi kedua yang diposting @krmritunjay11 di atas, tetapi masih tidak berhasil. Kode dan lingkungan yang sama bekerja dengan Whoosh.

Lingkungan saya saat ini adalah:
requirements.txt , dan saya menggunakan Solr 7.3.1 (tetapi saya mencoba Solr 6.X dan mendapatkan kesalahan yang sama)

Saya mendapatkan kesalahan berikut:

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'

Saya mengubah baris 947 dalam file di atas dari

 return int(value)

ke

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

Ini menciptakan kesalahan lain:

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'

Yang saya perbaiki dengan mengubah baris 181 dari

 result.pk = result_klass(result.pk)

ke

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

Pencarian sekarang berfungsi, tetapi solusi saya tampaknya meretas dan tidak kuat.

Adakah ide mengapa ini bisa terjadi dan jika ada perbaikan yang lebih baik?

Saya menemukan solusi lain tanpa menyentuh file inti Django.

Di dalam/site-packages/haystack/query.py, ubah baris 181 dari:

result.pk = result_klass(result.pk)

Ke:

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

Dan tambahkan berikut ini sebelum baris 205:

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

Jadi blok try berakhir seperti ini:

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)

Itu bekerja menggunakan Django 1.11, haystack 2.7.0 dan solr 5.5.5

Hai.

Saya memiliki masalah yang sama dan menggabungkan solusi dari komentator lain, saya berhasil menemukan solusi yang berfungsi. Untung Anda dapat mengganti SolrEngine dan menggunakan versi tetap Anda sampai diperbaiki di tumpukan jerami.

Saya menggunakan haystack 2.8.1 dan solr 8.5.2.

Edit file haystack/backends/solr_backend.py untuk memeriksa apakah itu berfungsi untuk Anda:

  • Temukan dan ganti
    python app_label, model_name = raw_result[DJANGO_CT].split('.')
    ke
    python app_label, model_name = raw_result[DJANGO_CT][0].split('.')
  • Temukan dan ganti
    python result = result_class(app_label, model_name, raw_result[DJANGO_ID], raw_result['score'], **additional_fields)
    ke
    python result = result_class(app_label, model_name, raw_result[DJANGO_ID][0], raw_result['score'], **additional_fields)
  • Temukan dan ganti
    python for key, value in raw_result.items(): value = value[0]
    ke
    python for key, value in raw_result.items(): if isinstance(value, list): value = value[0]

Semua PR diterima.

Semua PR diterima.

Ya, tapi saya merasa saya tidak cukup kompeten untuk mengusulkan solusi yang benar-benar bisa diterapkan. Perubahan saya berfungsi dengan baik untuk saya, tetapi saya tidak menguji pada versi yang lebih rendah dari mesin Solr. Apakah masih layak untuk membuat PR?

Dapat direproduksi menggunakan Django-haystack 3.0 dan Solr 7.7.3

@jcrbsa Bisakah Anda mengirimkan tes yang gagal? Saya tidak punya cara untuk mereproduksi ini.

@acdha , ikuti langkah-langkah ini

Setelah kueri berdasarkan formulir, tunjukkan kesalahan berikut di solr_backend.py:
C:\Python37\lib\site-packages\haystack\backends\solr_backend.py, baris 525, di _process_results

Setelah mengubah solr_backend.py dan kueri baru berdasarkan formulir, tunjukkan kesalahan berikut:
C:\Python37\lib\site-packages\Django\db\models\fields__init__.py, baris 1778, di get_prep_value

Itu tidak mereproduksi, mungkin karena saya memiliki skema Solr standar yang menggunakan tipe yang diharapkan. Bisakah Anda memberikan tes yang gagal?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat