์ ๋ haystack์ ๋ฐฑ์๋๋ก solr์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ์ค๋น ๋ช ๋ น(schema.xml ์์ฑ ๋ฑ)์ ์ํํ์ง๋ง ์ฒซ ๋ฒ์งธ ๊ฒ์์ ํ๋ ค๊ณ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ ๋ด ํ์ด์ฌ ํ๊ฒฝ์ ๋๋ค.
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๋ ๋ฌธ์์ด์ด ์๋๋ผ ๋ชฉ๋ก์ ๋๋ค.
๋์์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ด๊ฐํ๊ณ ์๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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://stackoverflow.com/questions/30427643/fields-in-apache-solr-response-are-multivalued-when-they-should-be-singular/30484017#30484017
Haystack์ Solr v5.*์ ํธํ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ ์ง์นจ์ ๋ฐ๋ผ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด https://lucene.apache.org/solr/4_2_0/solr-core/ ์ ๊ฐ์ด ์ฌ์ฉ๋์ง ์๋ ํด๋์ค ๋ฐ Solr์์ ์์ ํ ์ ๊ฑฐ๋ ํด๋์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ง ์๋ํ์ง ์์์ง๋ง ๋ฌธ์์ ๋ฐ๋ผ 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 ์ด ๋ฒ๊ทธ๋ฅผ ์ผ์์ ์ผ๋ก ์์ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ์์๋์ต๋๋ค.
<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>
Solr 5๋ฅผ Haystack๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ์ฌ๋์ด ์์ต๋๊น?
์ค๋ฅ๊ฐ ํ๋์ฉ ๋ฐ์ํ๊ณ ์์ต๋๋ค. ํ์ฌ text_general ํ๋ ์ ํ์ ๋ํด Error instantiating class: 'org.apache.lucene.analysis.core.StopFilterFactory'
์ ๊ณ ์ ๋์ด ์์ต๋๋ค.
ํ์ฌ ์๋ํ๊ณ ์์ต๋๋ค. ์์ํ๊ธฐ ์ํ ๊ฐ์ฅ ํฐ ๊ถ์ฅ ์ฌํญ์ ๊ธฐ๋ณธ Solr schema.xml์ ์ฌ์ฉํ๊ณ ํ์ํ Django ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. id, django_ct, *_exact(๋ฐฉ๊ธ ๋์ ํ๋๋ก ์ ๋ ฅํ์ต๋๋ค) ๋ฐ ๊ธฐํ ๋ช ๊ฐ์ง๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๊ฒ๋ณด๋ค ์๊ฐ์ ๋ง์ด ์ ์ฝํ ์ ์์ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค.
์ ๋ ํฌ๊ธฐํ๊ณ Solr์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ "๋์ " ์คํค๋ง๋ฅผ ๊ณ ์ํ์ต๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ ๊ฒ ๊ฐ์ต๋๋ค https://github.com/nazariyg/Solr-5-for-django-haystack
๊ธ์ ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ํด๋ณด๊ณ ๋ค์ ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค.
@nazariyg ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค. ์ด๋ค ๋ํต.
@nazariyg ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด๋ค Haystack ๋ฐ Django ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์ ๋ Django 1.9.4๋ฅผ ์ฌ์ฉ ์ค์ด๊ณ Win์์ Solr 5.5๋ฅผ ์๋ํ๋ Haystack 2.5๋ฅผ ๋ค์ด๋ก๋ํ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ ์๋ Solr์์ ๋จ์ผ ํํธ๋ฅผ ๊ฒ์ํ ์ ์์์ต๋๋ค. ์ง๊ธ์ ์ฌ์ ํ โโ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค.
_'list' ๊ฐ์ฒด์ 'split' ์์ฑ์ด ์์ต๋๋ค.
์ด ์์ ์์ solr_backend.py๊ฐ ๋์ก์ต๋๋ค.
for raw_result in raw_results.docs:
app_label, model_name = raw_result[DJANGO_CT].split('.')
SOLR6๊ณผ ํตํฉํ ๋ ์ถ๊ฐ ๊ตฌ์ฑ์ ์ํํด์ผ ํ์ต๋๋ค. ๋ค์ ๋งํฌ์์ ์ํํ ๋จ๊ณ๋ฅผ ๋ฌธ์ํํ์ต๋๋ค.
๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ด ์์ต๋๊น? ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
๋๋ ๋ชจ๋ ๊ฒ์ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค.
@dekanayake ํ๋ณด ๋ถํ๋๋ฆฝ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Haystack์ Solr 6๊ณผ ํธํ๋ ์ ์์ต๋๊น?
@cauanicastro ์ค๋๋ง์ ๋๋ค. #1504 ์คํค๋ง ์์ฑ์ ์ํ ์ผ๋ถ ์ ๋ฐ์ดํธ๊ฐ ์๋ฃ๋์์ง๋ง ๊ฝค ์ค๋ซ๋์ ์คํํ์ต๋๋ค.
๋๋ ๋ํ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ฌด ์ค๋ง
@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]
๊ทธ๋ฐ ๋ค์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์์ ์๋ํ ๋ "'๋ชฉ๋ก' ๊ฐ์ฒด์ '๋ถํ ' ์์ฑ์ด ์์ต๋๋ค"๋ผ๋ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค. ์๋์ ์ฝ๋๋ฅผ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
/search/์ AttributeError
'list' ๊ฐ์ฒด์ 'split' ์์ฑ์ด ์์ต๋๋ค.
์์ฒญ ๋ฐฉ๋ฒ: GET
์์ฒญ URL: http://127.0.0.1 :8000/search/?q=w
์ฅ๊ณ ๋ฒ์ : 1.10
์์ธ ์ ํ: AttributeError
์์ธ ๊ฐ:
'list' ๊ฐ์ฒด์ 'split' ์์ฑ์ด ์์ต๋๋ค.
์์ธ ์์น: /Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py์ _process_results, 406ํ
ํ์ด์ฌ ์คํ ํ์ผ: /Users/ja/3.5/bin/python
ํ์ด์ฌ ๋ฒ์ : 3.5.1
ํ์ด์ฌ ๊ฒฝ๋ก:
['/Users/ja/Dropbox/Programming/Django/piaoyou',
'/์ฌ์ฉ์/ja/3.5/lib/python35.zip',
'/์ฌ์ฉ์/ja/3.5/lib/python3.5',
'/์ฌ์ฉ์/ja/3.5/lib/python3.5/plat-darwin',
'/์ฌ์ฉ์/ja/3.5/lib/python3.5/lib-dynload',
'/๋ผ์ด๋ธ๋ฌ๋ฆฌ/Frameworks/Python.framework/Versions/3.5/lib/python3.5',
'/๋ผ์ด๋ธ๋ฌ๋ฆฌ/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin',
'/์ฌ์ฉ์/ja/3.5/lib/python3.5/์ฌ์ดํธ ํจํค์ง',
'/๋ผ์ด๋ธ๋ฌ๋ฆฌ/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
์๋ฒ ์๊ฐ: 2017๋ 6์ 26์ผ ์์์ผ 05:01:18 +0000
ํ๊ฒฝ:
์์ฒญ ๋ฐฉ๋ฒ: GET
์์ฒญ URL: http://127.0.0.1 :8000/search/?q=w์ฅ๊ณ ๋ฒ์ : 1.10
ํ์ด์ฌ ๋ฒ์ : 3.5.1
์ค์น๋ ์ ํ๋ฆฌ์ผ์ด์ :
['๋ฌ',
'๋ฌ_์ ํ2',
'๋ง์ถค_ํ ํ๋ฆฟ',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'ํ์ ๊ถ',
'rest_framework',
'ํ์ด์ง๋ค์ด',
'๋ฐ์ญํ ํํ',
'ํ๊น',
'ํ๊ทธ๊น_ํ ํ๋ฆฟํ๊ทธ2',
'์ปค๋ค๋ ๊ฑด์ด ๋๋ฏธ',
'ํ',
'๋ค์_์ด์ ',
'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" ๊ฐ์
- ๋ฐํ self.object_list.count()
ํ์ผ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" ๊ฐ์
- ๋ฐํ len(์์ฒด)
__len__์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" ํ์ผ
- self._result_count = self.query.get_count()
get_count์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" ํ์ผ
- self.run()
์คํ ์ค์ธ ํ์ผ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py"
- ๊ฒฐ๊ณผ = self.backend.search(final_query, **search_kwargs)
๋ํผ์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" ํ์ผ
- return func(obj, query_string, args, * kwargs)
๊ฒ์์์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" ํ์ผ
- distance_point=kwargs.get('distance_point'))
_process_results์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" ํ์ผ
- 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"
- ์๋ต = get_response(์์ฒญ)
_get_response์ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" ํ์ผ
- ์๋ต = self.process_exception_by_middleware(e, ์์ฒญ)
_get_response์ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/handlers/base.py" ํ์ผ
- ์๋ต = wrap_callback(์์ฒญ, callback_args, * callback_kwargs)
๋ณด๊ธฐ์์ "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" ํ์ผ
- ๋ฐํ self.dispatch(์์ฒญ, ์ธ์, * kwargs)
๋์คํจ์น์์ "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/base.py" ํ์ผ
- ๋ฐํ ํธ๋ค๋ฌ(์์ฒญ, ์ธ์, * kwargs)
ํ์ผ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" ๊ฐ์ ธ์ค๊ธฐ
- self.form_valid(์์) ๋ฐํ
form_valid์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/generic_views.py" ํ์ผ
- 'object_list': self.queryset
get_context_data์ "/Users/ja/Dropbox/Programming/Django/piaoyou/piaoyouquan/view.py" ํ์ผ
- ์ปจํ ์คํธ = super(BillSearchView, ์์ฒด).get_context_data( ์ธ์, * kwargs)
get_context_data์ "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" ํ์ผ
- ํ์ด์ง ๋งค๊น, ํ์ด์ง, ์ฟผ๋ฆฌ ์ธํธ, is_paginated = self.paginate_queryset(queryset, page_size)
paginate_queryset์ "/Users/ja/3.5/lib/python3.5/site-packages/django/views/generic/list.py" ํ์ผ
- ํ์ด์ง = paginator.page(page_number)
ํ์ด์ง์ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" ํ์ผ
- ์ซ์ = self.validate_number(์ซ์)
validate_number์ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" ํ์ผ
- ์ซ์ > self.num_pages์ธ ๊ฒฝ์ฐ:
__get__์ "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" ํ์ผ
- res = instance.__dict__[self.name] = self.func(instance)
num_pages์ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" ํ์ผ
- self.count == 0์ด๊ณ self.allow_empty_first_page๊ฐ ์๋ ๊ฒฝ์ฐ:
__get__์ "/Users/ja/3.5/lib/python3.5/site-packages/django/utils/functional.py" ํ์ผ
- res = instance.__dict__[self.name] = self.func(instance)
ํ์ผ "/Users/ja/3.5/lib/python3.5/site-packages/django/core/paginator.py" ๊ฐ์
- ๋ฐํ len(self.object_list)
__len__์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/query.py" ํ์ผ
- self._result_count = self.query.get_count()
get_count์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" ํ์ผ
- self.run()
์คํ ์ค์ธ ํ์ผ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py"
- ๊ฒฐ๊ณผ = self.backend.search(final_query, **search_kwargs)
๋ํผ์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/__init__.py" ํ์ผ
- return func(obj, query_string, args, * kwargs)
๊ฒ์์์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" ํ์ผ
- distance_point=kwargs.get('distance_point'))
_process_results์ "/Users/ja/3.5/lib/python3.5/site-packages/haystack/backends/solr_backend.py" ํ์ผ
- app_label, model_name = raw_result[DJANGO_CT].split('.')
์์ธ ์ ํ: /search/์ AttributeError
์์ธ ๊ฐ: 'list' ๊ฐ์ฒด์ 'split' ์์ฑ์ด ์์ต๋๋ค.
์ ๋ Haystack๊ณผ ํจ๊ป Whoosh๋ฅผ ์ฌ์ฉํ๋๋ฐ Django์ ๋์ผํ ์ฝ๋์์ ์ ์๋ํ์ต๋๋ค.
Appium-Python-Client==0.24
์๋ฆ๋ค์ด ์ํ4==4.4.1
์ฌ์ดํด๋ฌ==0.10.0
์ฅ๊ณ ==1.10
django-autocomplete-light==3.2.7
django-classy-tags==0.8.0
django-crispy-forms==1.6.1
์ฅ๊ณ ํ์ฅ ==1.7.9
์ฅ๊ณ ํํฐ==1.0.4
django-haystack==2.6.1
django-next-prev==1.0.1
์ฅ๊ณ ํ์ด์ง๋ค์ด==0.1.3
django-taggit==0.22.1
django-taggit-templatetags2==1.6.1
์ฅ๊ณ -uuslug==1.1.8
์ฅ๊ณ ๋ ์คํธ ํ๋ ์์ํฌ==3.6.3
dnspython==1.15.0
EasyProcess==0.2.3
ez-์ค์ ==0.9
๊ฐ์ง ์ฌ์ฉ์ ์์ด์ ํธ == 0.1.7
gevent==1.2.2
๊ทธ๋ฆฐ๋ ==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
ํ์ด๋ทํ๋ฌ์ค==2.0.2
ํ์ดํ์ฑ==2.1.10
ํ์ดํ
์๋ํธ==0.1.7
ํ์ด์ฌ-dateutil==2.6.0
python-slugify==1.2.4
ํผ์ธ ==2016.10
ํ์ด๊ฐ์๋์คํ๋ ์ด==0.2.1
์ ๊ท์==2016.4.25
์์ฒญ==2.9.1
์ฌ์ดํท๋ฐ==0.18.1
์ฌ์ดํผ==0.19.0
์
๋ ๋==3.4.3
6==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๋จ๊ณ: ์ปฌ๋ ์
๊ด๋ฆฌ ์คํค๋ง ํ์ผ๋ก ์ด๋ํ์ฌ ํธ์ง
2๋จ๊ณ: <field name="django_ct" type="text_general"/>
๋ฅผ ์ฐพ์์ <field name="django_ct" type="string"/>
์๋ฃจ์ 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์ ๋ฐ๋ผ 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์ ํต์ฌ ํ์ผ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ฐพ์์ต๋๋ค.
์
result.pk = result_klass(result.pk)
NS:
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 , ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
์์๋ณ ์ฟผ๋ฆฌ ํ 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 ์คํค๋ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์๋์ง ์์ต๋๋ค. ์คํจํ ํ ์คํธ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
3-4์ผ ํ ๋๋ ํด๊ฒฐ์ฑ ์ ๋๋ฌํ์ต๋๋ค.
์๋ฃจ์ 1-: ์คํค๋ง ๋ณ๊ฒฝ
1๋จ๊ณ: ์ปฌ๋ ์ ๊ด๋ฆฌ ์คํค๋ง ํ์ผ๋ก ์ด๋ํ์ฌ ํธ์ง
2๋จ๊ณ:
<field name="django_ct" type="text_general"/>
๋ฅผ ์ฐพ์์<field name="django_ct" type="string"/>
์๋ฃจ์ 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('.')
๋ฐ๊พธ๊ธฐ