Django-haystack: 使用 solr 作为后端在第一次搜索时失败

创建于 2015-05-01  ·  41评论  ·  资料来源: django-haystack/django-haystack

我使用 solr 作为 haystack 的后端。 我执行了所有准备命令(生成 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:转到您的集合托管架构文件并编辑
Step2 :查找并替换<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
  • 干草堆版本:2.8.0

解决方案 2-:破解核心文件

第一步: sudo vim /home/你的路径/site-packages/haystack/backends/solr_backend.py
Step2:查找并替换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)

我发现 solr 没有使用生成的 schema.xml 文件。 现在 Solr 正在抱怨这个:

test_shard1_replica1:org.apache.solr.common.Solr异常:org.apache.solr.common.SolrException :无法为核心 test_shard1_replica1 加载 conf:[schema.xml] 的插件初始化失败 fieldType“sint”:错误加载类 'solr .SortableIntField'。 架构文件是 /configs/test/schema.xml

我也有同样的问题。 我想知道 schema.xml 是否在正确的目录中,尽管我不确定将它放在哪里。 我将它放在“server/solr/core_name_here/conf/”下,看到日志告诉我有一个意外的 schema.xml,我应该删除它,因为它已经被管理或诸如此类。

好的,我已经尝试解决这个问题好几天了,终于找到了它的底部。 请参阅此处: http :

Haystack 似乎与 Solr v5.* 不兼容。 按照上述说明解决此问题后,您将遇到弃用类和已从 Solr 中彻底删除的类的问题,例如https://lucene.apache.org/solr/4_2_0/solr-core/ org/apache/solr/schema/SortableIntField.html。

我还没有尝试过,但我建议根据文档可能回滚到 Solr v4.* 甚至 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 字段中,以使索引在 Solr 5.1 上工作。 您必须根据需要为您的特定模型添加字段,但这让我不知所措。 我不太了解 Django 应用程序,但这让 rich_content_extraction 至少可以将内容放入我的索引中。

@nikolaz111我想出了几个步骤来临时修复这个错误:

  • 在 solrconfig.xml 中将默认 schemafactory 更改为 Class 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.py rebuild_index
  • 由于我们将 schema.xml 覆盖到核心,避免使用 ManagedIndexSchemaFactory,solrconfig.xml 中的许多类将不会被调用。 我现在正在使用一个 xml,我希望有人会感兴趣
    https://gist.github.com/DrChai/033604cd04c869f40ade

有人让 Solr 5 与 Haystack 一起工作吗?

我遇到了一个又一个错误。 当前停留在Error instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory'用于 text_general 字段类型。

我有它目前工作。 我开始的最大建议是使用默认的 Solr schema.xml 并简单地添加必要的 Django 字段。 您需要添加 id、django_ct、*_exact(我只是将它作为动态字段放入)以及其他一些。 我认为这会为您节省大量时间,而不是反过来。

我放弃了,只是坚持使用 Solr 似乎默认的“动态”模式。

看起来很积极,我会尝试一下并报告。

@nazariyg的解决方法对我

@nazariyg您的解决方法是使用哪个 Haystack 和 Django 版本?
我在 Django 1.9.4 上下载了 Haystack 2.5,在 Win 上尝试 Solr 5.5
在您解决此问题之前,我无法从 Solr 中检索到一次命中,现在我仍然面临这个问题

_'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请公关。

那么,Haystack 会与 Solr 6 兼容吗?

@cauanicastro已经有一段时间了。 #1504 完成了一些方案生成的更新,但我已经运行了一段时间

我也遇到过这个bug。 太令人沮丧了

@wagaman仍然存在这个错误吗?

@wagaman你有可重现的测试用例吗?

感谢您的回复。 我有 slor 6。我有一个收集原始 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/ 处的属性错误
'list' 对象没有属性 'split'
请求方式:GET
请求地址: http :
Django 版本:1.10
异常类型:属性错误
异常值:
'list' 对象没有属性 'split'
异常位置:/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py in _process_results, line 406
Python 可执行文件:/Users/ja/3.5/bin/python
Python版本:3.5.1
蟒蛇路径:
['/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-06-26 05:01:18 +0000

环境:

请求方式:GET
请求地址: http :

Django 版本:1.10
Python版本:3.5.1
已安装的应用程序:
['达尔',
'dal_select2',
'custom_template',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'飘油泉',
'rest_framework',
'向下翻页',
'脆皮形式',
'塔吉特',
'taggit_templatetags2',
'草垛',
'嗖嗖',
'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. return 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. 响应 = 获取响应(请求)

_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(请求, 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. 返回处理程序(请求,参数,* kwargs)

获取文件“/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py”

  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.pagination_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. number = self.validate_number(number)

文件“/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py”在validate_number

  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. return 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'

我曾经将 Whoosh 与 Haystack 一起使用,它在 Django 中使用相同的代码运行良好。

Appium-Python-客户端==0.24
beautifulsoup4==4.4.1
循环器==0.10.0
姜戈==1.10
django-autocomplete-light==3.2.7
django-classy-tags==0.8.0
django-脆皮形式==1.6.1
django 扩展==1.7.9
django-过滤器==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
假用户代理==0.1.7
gevent==1.2.2
greenlet==0.4.12
干草堆==0.36
结巴==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
六==1.10.0
sklearn==0.0
超立方体==0.1.3
tqdm==4.14.0
单解码==0.4.20
更新==0.4.4
Werkzeug==0.12.2
嗖嗖==2.7.4
winappdbg==1.5
xvfbwrapper==0.2.9

3-4 天后,我达到了解决方案。

解决方案 1-:更改架构

步骤 1:转到您的集合托管架构文件并编辑
Step2 :查找并替换<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
  • 干草堆版本:2.8.0

解决方案 2-:破解核心文件

第一步: sudo vim /home/你的路径/site-packages/haystack/backends/solr_backend.py
Step2:查找并替换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发布的第二种解决方案,但它仍然不起作用。 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 和 solr 5.5.5

你好。

我有同样的问题,结合其他评论员的解决方案,我设法找到了一个可行的解决方案。 好消息是你可以覆盖 SolrEngine 并使用你的固定版本,直到它在大海捞针中得到修复。

我正在使用 haystack 2.8.1 和 solr 8.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]

欢迎所有公关人员。

欢迎所有公关人员。

是的,但我觉得我没有足够的能力提出一个完全可行的解决方案。 我的更改非常适合我,但我没有在较低版本的 Solr 引擎上进行测试。 还值得创建 PR 吗?

可使用 django-haystack 3.0 和 Solr 7.7.3 重现

@jcrbsa你能提交失败的测试吗? 我没有办法重现这个。

@acdha ,按照这些步骤

按form查询后,在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 等级