Django-haystack: solrをバックエンドとして使用すると、最初の検索で失敗します

作成日 2015年05月01日  ·  41コメント  ·  ソース: django-haystack/django-haystack

haystackのバックエンドとしてsolrを使用しています。 すべての準備コマンド(schema.xmlの生成など)を実行しましたが、最初の検索を実行しようとすると、例外が発生します。

これは私の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

私が遭遇する例外はこれです:

'list' object has no attribute 'split'

solrがdjango_ctフィールドのリストで応答するために発生するようですが、haystackは文字列を期待していると思います。

これはスタックトレースです:

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'

そして、これは例外のローカル変数です:

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

ご覧のとおり、django_ctはリストであり、文字列ではありません。

どんな助けでも大歓迎です。

solr highpriority

最も参考になるコメント

3〜4日後、私は解決策に到達しました。

解決策1-:スキーマの変更

ステップ1:コレクションの管理スキーマファイルに移動して編集します
ステップ2: <field name="django_ct" type="text_general"/>を見つけて<field name="django_ct" type="string"/>置き換えます

  • オペレーティングシステムのバージョン:Ubuntu 14.04 LTS
  • 検索エンジンのバージョン:Solr 7.2.1
  • Pythonバージョン:3.4.3
  • Djangoバージョン:2.0
  • Haystackバージョン:2.8.0

解決策2-:コアファイルをハックする

ステップ1: sudo vim / home / your path / site-packages / haystack / backends / solr_backend.py
ステップ2: app_label, model_name = raw_result[DJANGO_CT].split('.')を見つけてapp_label, model_name = raw_result[DJANGO_CT][0].split('.')置き換えます

全てのコメント41件

ちなみに、私が行っているクエリは次のとおりです。

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

生成されたschema.xmlファイルを使用していないことがわかりました。 現在、Solrはこれについて不平を言っています:

test_shard1_replica1:org.apache.solr.common.Solr Exception:org.apache.solr.common.SolrException :コアのconfを読み込めませんでしたtest_shard1_replica1:[schema.xml] fieldType "sint"のプラグイン初期化エラー:クラス 'solrの読み込みエラー.SortableIntField '。 スキーマファイルは/configs/test/schema.xmlです。

私も同じ問題を抱えています。 schema.xmlが正しいディレクトリにあるかどうか疑問に思いましたが、他にどこに配置するかはわかりませんでした。 'server / solr / core_name_here / conf /'の下に配置しましたが、ログに予期しないschema.xmlがあり、すでに管理されているなどの理由で削除する必要があることが示されていました。

さて、私はこの問題を何日も分類しようとしてきましたが、ついにその根底に到達しました。 ここを参照してください: http

HaystackはSolrv5。*と互換性がないようです。 上記の手順に従ってこの問題を修正すると、非推奨のクラスや、 https: //lucene.apache.org/solr/4_2_0/solr-core/などのSolrから完全に削除されたクラスで問題が発生し

私はまだこれを試みていませんが、ドキュメントに従って、Solrv4。*またはv.3.5にロールバックすることをお勧めします。 誰かがこれを反映するようにドキュメントを更新し、さらにテストを行う必要があります。

あるいは、Solrに精通している場合は、schema.xmlを修正することもできますが、今後他の問題が発生するかどうかはわかりません。

関連チケット:
https://github.com/django-haystack/django-haystack/issues/1199

4.xは確実にサポートされています–すべてのテストは4.7に対して実行されます。 @sampekaこれを掘り下げてくれてありがとう。 これも#1200のように見えます。

#1183に関する私のコメントをチェックしてください。 後で問題が発生するかどうかはわかりませんが、デフォルトのschema.xmlのいずれかを使用し、適切なDjangoフィールドに貼り付けて、Solr5.1でインデックスを機能させるようにしました。 特定のモデルの必要に応じてフィールドを追加する必要がありますが、これで私は理解できなくなりました。 私はDjangoアプリにそれほど詳しく

@ nikolaz111私はこのバグを

  • solrconfig.xmlで、デフォルトのスキーマファクトリをクラスClassicIndexSchemaFactoryに変更します
  • クラスinitParamsの場合:
<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
    <lst name="defaults">
      <str name="df">_text_</str>
    </lst>
  </initParams>

への変更

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell">
            <lst name="defaults">
            <str name="df">text</str>
            </lst>
</initParams>
  • mange.pyrebuild_indexを実行します
  • schema.xmlをコアに上書きするため、ManagedIndexSchemaFactoryの使用は避けてください。これにより、solrconfig.xmlの多くのクラスが呼び出されなくなります。 私が今使っているxmlがあります、誰かが興味を持ってくれることを願っています
    https://gist.github.com/DrChai/033604cd04c869f40ade

Solr 5をHaystackで動作させる人はいますか?

私は次々とエラーに遭遇しています。 現在、text_generalフィールドタイプのError instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory'でスタックしています。

現在動作しています。 始めるための私の最大の推奨事項は、デフォルトのSolr schema.xmlを使用し、必要なDjangoフィールドを追加することです。 id、django_ct、* _ excact(動的フィールドとして投入しただけです)などを追加する必要があります。 逆に行かなくても、時間を大幅に節約できると思います。

私はあきらめて、Solrがデフォルトで使用しているように見える「動的」スキーマに固執しました。

これは私にとってはうまくいったようですhttps://github.com/nazariyg/Solr-5-for-django-haystack

ポジティブに見えます。試してみて、報告します。

@nazariygの回避策は私のために働きます。 なんて頭痛の種。

@nazariyg回避策で使用しているHaystackとDjangoのバージョンはどれですか?
私はDjango1.9.4を使用していて、WinでSolr5.5を試しているHaystack2.5をダウンロードしました
回避策の前は、Solrから1つのヒットを取得できませんでしたが、まだ問題に直面しています。

_'list 'オブジェクトには属性' split'_がありません

この時点でsolr_backend.pyによってスローされます

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

SOLR6と統合するときに、追加の構成を行う必要がありました。 次のリンクで実行した手順を文書化しました。

https://github.com/dekanayake/haystack_solr6

この問題の解決策はありますか? 回避策ではありません。
私はすべてに最新バージョンを使用しようとしました。

@dekanayakeはprを作ってください。

では、HaystackはSolr 6と互換性があるのでしょうか?

@cauanicastroそれはしばらくの間ありました。 #1504はスキーム生成のためのいくつかの更新を終了しましたが、私はかなり長い間それを実行しています

私もこのバグに遭遇しました。 とてもイライラする

@wagamanこのバグはまだ存在しますか?

@wagaman再現可能なテストケースはありますか?

返信ありがとうございます。 私はslor6を持っています。生のHTMLを収集するデータベースがあるので、各行はかなり大きくなります。 インデックスを再生成すると、HTMLセルである「コンテンツ」が大きすぎると表示されます。 オンラインのチュートリアルに従って、タイプを文字列から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]

その後、インデックスを生成することができます。 しかし、検索しようとすると、「 'list'オブジェクトには属性 'split'がありません」というメッセージが表示されます。 以下のコードを掲載します。

/ search /でのAttributeError
'list'オブジェクトには属性 'split'がありません
リクエスト方法:GET
リクエストURL: http
Djangoバージョン:1.10
例外タイプ:AttributeError
例外値:
'list'オブジェクトには属性 'split'がありません
例外の場所:_process_resultsの406行目の/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py
Python実行可能ファイル:/Users/ja/3.5/bin/python
Pythonバージョン:3.5.1
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']
サーバー時間:2017年6月26日月曜日05:01:18 +0000

環境:

リクエスト方法:GET
リクエストURL: http

Djangoバージョン:1.10
Pythonバージョン:3.5.1
インストールされているアプリケーション:
['dal'、
'dal_select2'、
'custom_template'、
'django.contrib.admin'、
'django.contrib.auth'、
'django.contrib.contenttypes'、
'django.contrib.sessions'、
'django.contrib.messages'、
'django.contrib.staticfiles'、
'piaoyouquan'、
'rest_framework'、
'ページダウン'、
'crispy_forms'、
'taggit'、
'taggit_templatetags2'、
「干し草の山」、
'whoosh'、
'next_prev'、
'django_extensions']
インストールされているミドルウェア:
['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']

トレースバック:

ファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py」の数

  1. self.object_list.count()を返します

ファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py」の数

  1. len(self)を返す

__len__のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py」

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

get_countのファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py」

  1. self.run()

実行中のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py」

  1. 結果= self.backend.search(final_query、** search_kwargs)

ラッパー内のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py」

  1. func(obj、query_string、 args、* kwargs)を返します

検索でファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py」

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

_process_resultsのファイル "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py"

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

上記の例外の処理中に(「list」オブジェクトには属性「split」がありません)、別の例外が発生しました:

内部のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/exception.py」

  1. response = get_response(request)

_get_responseのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py」

  1. response = self.process_exception_by_middleware(e、request)

_get_responseのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py」

  1. 応答= wrapped_callback(request、 callback_args、* callback_kwargs)

ビュー内のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py」

  1. self.dispatch(request、 args、* kwargs)を返します

ディスパッチ中のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py」

  1. ハンドラーを返す(request、 args、* kwargs)

ファイル "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" in get

  1. self.form_valid(form)を返します

form_validのファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py」

  1. 'object_list':self.queryset

get_context_dataのファイル「/Users/ja/Dropbox/Programming/Django/piaoyou/piaoyouquan/views.py」

  1. context = super(BillSearchView、self).get_context_data( args、* kwargs)

get_context_dataのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py」

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

paginate_querysetのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py」

  1. page = paginator.page(page_number)

ページ内のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py」

  1. 数値= self.validate_number(数値)

validate_numberのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py」

  1. 番号> self.num_pagesの場合:

__get__のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py」

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

num_pagesのファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py」

  1. self.count == 0で、self.allow_empty_first_pageではない場合:

__get__のファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py」

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

ファイル「/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py」の数

  1. len(self.object_list)を返します

__len__のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py」

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

get_countのファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py」

  1. self.run()

実行中のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py」

  1. 結果= self.backend.search(final_query、** search_kwargs)

ラッパー内のファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py」

  1. func(obj、query_string、 args、* kwargs)を返します

検索でファイル「/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py」

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

_process_resultsのファイル "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py"

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

例外タイプ:/ search /のAttributeError
例外値: 'list'オブジェクトに属性 'split'がありません

以前はHaystackでWhooshを使用していましたが、Djangoの同じコードで正常に機能しました。

Appium-Python-Client == 0.24
beautifulsoup4 == 4.4.1
サイクラー== 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
django-filter == 1.0.4
django-haystack == 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
グリーンレット== 0.4.12
haystack == 0.36
jieba == 0.38
lxml == 3.6.0
マークダウン== 2.6.8
matplotlib == 2.0.0
numpy == 1.11.0
olefile == 0.44
枕== 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
正規表現== 2016.4.25
リクエスト== 2.9.1
scikit-learn == 0.18.1
scipy == 0.19.0
セレン== 3.4.3
6 == 1.10.0
sklearn == 0.0
tesseract == 0.1.3
tqdm == 4.14.0
Unidecode == 0.4.20
update == 0.4.4
Werkzeug == 0.12.2
うわー== 2.7.4
winappdbg == 1.5
xvfbwrapper == 0.2.9

3〜4日後、私は解決策に到達しました。

解決策1-:スキーマの変更

ステップ1:コレクションの管理スキーマファイルに移動して編集します
ステップ2: <field name="django_ct" type="text_general"/>を見つけて<field name="django_ct" type="string"/>置き換えます

  • オペレーティングシステムのバージョン:Ubuntu 14.04 LTS
  • 検索エンジンのバージョン:Solr 7.2.1
  • Pythonバージョン:3.4.3
  • Djangoバージョン:2.0
  • Haystackバージョン:2.8.0

解決策2-:コアファイルをハックする

ステップ1: sudo vim / home / your path / site-packages / haystack / backends / solr_backend.py
ステップ2: app_label, model_name = raw_result[DJANGO_CT].split('.')を見つけてapp_label, model_name = raw_result[DJANGO_CT][0].split('.')置き換えます

@acdhaこれはどうしたの?

この問題を再現する能力を持っている人は、スキーマ構成をデフォルトから何が変更しているのかを理解できますか? Haystackはhttps://github.com/django-haystack/django-haystack/blob/9eb42dac5cd918c991ac7c939d6de81a02a1aba1/haystack/templates/search_configuration/schema.xml#L81に従ってstringを使用することになっていますが、複数の人のように聞こえtext_generalになることがわかりました。

@ krmritunjay11テストできますか?

同様の問題があり、 @ krmritunjay11が上記に投稿した2番目の解決策を試しましたが、それでも機能しませんでした。 同じコードと環境がWhooshで機能しました。

私の現在の環境は次のとおりです。
Requirements.txtで、Solr 7.3.1を使用しています(ただし、Solr 6.Xを試したところ、同じエラーが発生していました)

次のエラーが発生していました。

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'

上記のファイルの947行目を

 return int(value)

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

これにより、別のエラーが発生しました。

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'

181行目をから変更して修正しました

 result.pk = result_klass(result.pk)

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

検索は機能するようになりましたが、私のソリューションはハッキーで堅牢ではないようです。

なぜこれが起こっているのか、そしてより良い修正があるかどうかについてのアイデアはありますか?

djangoのコアファイルに触れずに別の解決策を見つけました。

/site-packages/haystack/query.py、行181を次のように変更します。

result.pk = result_klass(result.pk)

に:

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

そして、205行目の前に以下を追加します。

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

したがって、tryブロックは次のようになります。

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)

これは、django 1.11、haystack 2.7.0、およびsolr5.5.5を使用して機能しました。

やあ。

私は同じ問題を抱えており、他のコメンテーターからの解決策を組み合わせて、実用的な解決策を見つけることができました。 SolrEngineをオーバーライドして、干し草の山で修正されるまで修正バージョンを使用できるのは良いことです。

haystack2.8.1とsolr8.5.2を使用しています。

ファイルhaystack / backends / solr_backend.pyを編集して、それが機能するかどうかを確認します。

  • 検索して置き換えます
    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]

すべてのPRは大歓迎です。

すべてのPRは大歓迎です。

はい、しかし私は完全に実行可能な解決策を提案するのに十分な能力があるとは感じていません。 私の変更は完全にうまく機能しますが、Solrエンジンの下位バージョンではテストしませんでした。 PRを作成する価値はありますか?

django-haystack3.0およびSolr7.7.3を使用して再現可能

@jcrbsa失敗したテストを提出できますか? これを再現する方法はありません。

@acdha 、これらの手順に従ってください

フォームによるクエリの後、solr_backend.pyに次のエラーを表示します。
C:\ Python37 \ lib \ site-packages \ haystack \ backends \ solr_backend.py、525行目、_process_results

solr_backend.pyを変更し、フォームごとに新しいクエリを実行した後、次のエラーが表示されます。
C:\ Python37 \ lib \ site-packages \ django \ db \ models \ fields__init __。py、1778行、get_prep_value

おそらく、期待される型を使用する標準のSolrスキーマがあるため、これは再現されません。 失敗したテストを提供できますか?

このページは役に立ちましたか?
0 / 5 - 0 評価