2013-07-12 32 views
0

我想实现草堆tutorial: 但我面临的问题:草堆索引错误

如果我已经在我的数据库数据,并尝试使用来构建指数:

python manage.py rebuild_index它提供了以下错误:

[email protected]:~/temp/HayStackDemo$ python manage.py rebuild_index -v2 

WARNING: This will irreparably remove EVERYTHING from your search index in connection 'default'. 
Your choices after this are to restore from backups or rebuild via the `rebuild_index` command. 
Are you sure you wish to continue? [y/N] y 

Removing all documents from your index because you said so. 
All documents removed. 
Skipping '<class 'django.contrib.auth.models.Permission'>' - no index. 
Skipping '<class 'django.contrib.auth.models.Group'>' - no index. 
Skipping '<class 'django.contrib.auth.models.User'>' - no index. 
Skipping '<class 'django.contrib.contenttypes.models.ContentType'>' - no index. 
Skipping '<class 'django.contrib.sessions.models.Session'>' - no index. 
Skipping '<class 'django.contrib.sites.models.Site'>' - no index. 
Skipping '<class 'django.contrib.admin.models.LogEntry'>' - no index. 
Indexing 1 notes 
    indexed 1 - 1 of 1 (by 30508). 
ERROR:root:Error updating demoApp using default 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 210, in handle_label 
    self.update_backend(label, using) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 256, in update_backend 
    do_update(backend, index, qs, start, end, total, self.verbosity) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 78, in do_update 
    backend.update(index, current_qs) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/backends/elasticsearch_backend.py", line 155, in update 
    prepped_data = index.full_prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/indexes.py", line 196, in full_prepare 
    self.prepared_data = self.prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/indexes.py", line 187, in prepare 
    self.prepared_data[field.index_fieldname] = field.prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 152, in prepare 
    return self.convert(super(CharField, self).prepare(obj)) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 73, in prepare 
    return self.prepare_template(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 129, in prepare_template 
    t = loader.select_template(template_names) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py", line 193, in select_template 
    raise TemplateDoesNotExist(', '.join(not_found)) 
TemplateDoesNotExist: search/indexes/demoApp/note_text.txt 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/rebuild_index.py", line 15, in handle 
    call_command('update_index', **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 150, in call_command 
    return klass.execute(*args, **defaults) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 184, in handle 
    return super(Command, self).handle(*items, **options) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 341, in handle 
    label_output = self.handle_label(label, **options) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 210, in handle_label 
    self.update_backend(label, using) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 256, in update_backend 
    do_update(backend, index, qs, start, end, total, self.verbosity) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 78, in do_update 
    backend.update(index, current_qs) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/backends/elasticsearch_backend.py", line 155, in update 
    prepped_data = index.full_prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/indexes.py", line 196, in full_prepare 
    self.prepared_data = self.prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/indexes.py", line 187, in prepare 
    self.prepared_data[field.index_fieldname] = field.prepare(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 152, in prepare 
    return self.convert(super(CharField, self).prepare(obj)) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 73, in prepare 
    return self.prepare_template(obj) 
    File "/usr/local/lib/python2.7/dist-packages/haystack/fields.py", line 129, in prepare_template 
    t = loader.select_template(template_names) 
    File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py", line 193, in select_template 
    raise TemplateDoesNotExist(', '.join(not_found)) 
django.template.base.TemplateDoesNotExist: search/indexes/demoApp/note_text.txt 

如果我删除所有数据,然后尝试我得到这个:

[email protected]:~/temp/HayStackDemo$ python manage.py rebuild_index -v2 

WARNING: This will irreparably remove EVERYTHING from your search index in connection 'default'. 
Your choices after this are to restore from backups or rebuild via the `rebuild_index` command. 
Are you sure you wish to continue? [y/N] y 

Removing all documents from your index because you said so. 
All documents removed. 
Skipping '<class 'django.contrib.auth.models.Permission'>' - no index. 
Skipping '<class 'django.contrib.auth.models.Group'>' - no index. 
Skipping '<class 'django.contrib.auth.models.User'>' - no index. 
Skipping '<class 'django.contrib.contenttypes.models.ContentType'>' - no index. 
Skipping '<class 'django.contrib.sessions.models.Session'>' - no index. 
Skipping '<class 'django.contrib.sites.models.Site'>' - no index. 
Skipping '<class 'django.contrib.admin.models.LogEntry'>' - no index. 
Indexing 0 notes 

我search_indexes.py

import datetime 
from haystack import indexes 
from demoApp.models import Note 

#------------------------------------------------------------------------------ 

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 

    author = indexes.CharField(model_attr='user') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 
    text = indexes.CharField(document=True, use_template=True) 

    def get_model(self): 
     return Note 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(pub_date__gte=datetime.datetime.now()) 

我已经使用这个类和方法,但是毫无效果..

import datetime 
from haystack import indexes 
from demoApp.models import Note 

#------------------------------------------------------------------------------ 


#All Fields 
class AllNoteIndex(indexes.ModelSearchIndex, indexes.Indexable): 
    class Meta: 
     model = Note 

而这也尝试:

import datetime 
from haystack import indexes 
from demoApp.models import Note 

#------------------------------------------------------------------------------ 

class NoteIndex(indexes.SearchIndex, indexes.Indexable): 

    author = indexes.CharField(model_attr='user') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 
    text = indexes.CharField(document=True, use_template=True) 

    def get_model(self): 
     return Note 

def load_all_queryset(self): 
    # Pull all objects related to the Note in search results. 
    return Note.objects.all().select_related() 

但每一次同样的问题。如果我改变我的项目设置文件的时区设置,并尝试更新或重建一次索引我得到这个错误....

我的DIR结构:

[email protected]:~/temp/HayStackDemo$ tree 
. 
├── demoApp 
│   ├── __init__.py 
│   ├── __init__.pyc 
│   ├── models.py 
│   ├── models.pyc 
│   ├── search_indexes.py 
│   ├── search_indexes.pyc 
│   ├── templates 
│   │   └── search 
│   │    ├── indexes 
│   │    │   └── demoApp 
│   │    │    └── note_text.txt 
│   │    └── search.html 
│   ├── tests.py 
│   └── views.py 
├── HayStackDemo 
│   ├── __init__.py 
│   ├── __init__.pyc 
│   ├── settings.py 
│   ├── settings.pyc 
│   ├── urls.py 
│   ├── urls.pyc 
│   ├── wsgi.py 
│   └── wsgi.pyc 
├── manage.py 
└── sqlite.db 

settings.py

# Django settings for HayStackDemo project. 

DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (
    # ('Your Name', '[email protected]'), 
) 

MANAGERS = ADMINS 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
     'NAME': '/home/vaibhav/temp/HayStackDemo/sqlite.db',      # Or path to database file if using sqlite3. 
     'USER': '',      # Not used with sqlite3. 
     'PASSWORD': '',     # Not used with sqlite3. 
     'HOST': 'localhost',      # Set to empty string for localhost. Not used with sqlite3. 
     'PORT': '',      # Set to empty string for default. Not used with sqlite3. 
    } 
} 

# Hosts/domain names that are valid for this site; required if DEBUG is False 
# See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts 
ALLOWED_HOSTS = [] 

# Local time zone for this installation. Choices can be found here: 
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 
# although not all choices may be available on all operating systems. 
# In a Windows environment this must be set to your system time zone. 
TIME_ZONE = 'America/Chicago' 
#'Asia/Kolkata' 

# Language code for this installation. All choices can be found here: 
# http://www.i18nguy.com/unicode/language-identifiers.html 
LANGUAGE_CODE = 'en-us' 

SITE_ID = 1 

# If you set this to False, Django will make some optimizations so as not 
# to load the internationalization machinery. 
USE_I18N = True 

# If you set this to False, Django will not format dates, numbers and 
# calendars according to the current locale. 
USE_L10N = True 

# If you set this to False, Django will not use timezone-aware datetimes. 
USE_TZ = True 

# Absolute filesystem path to the directory that will hold user-uploaded files. 
# Example: "/home/media/media.lawrence.com/media/" 
MEDIA_ROOT = '' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 
MEDIA_URL = '' 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/home/media/media.lawrence.com/static/" 
STATIC_ROOT = '' 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = '/static/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

# Make this unique, and don't share it with anybody. 
SECRET_KEY = 'kg5kd%92#5*ybo-$92ci$u349s$1*xhmhnq68!oue%r=^fq#yz' 

# List of callables that know how to import templates from various sources. 
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
#  'django.template.loaders.eggs.Loader', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'HayStackDemo.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'HayStackDemo.wsgi.application' 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin',  
    'haystack', 
    'demoApp', 
) 

HAYSTACK_CONNECTIONS = { 
    'default': { 
     'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 
     'URL': 'http://127.0.0.1:9200/', 
     'INDEX_NAME': 'haystack', 
    }, 
} 

# A sample logging configuration. The only tangible logging 
# performed by this configuration is to send an email to 
# the site admins on every HTTP 500 error when DEBUG=False. 
# See http://docs.djangoproject.com/en/dev/topics/logging for 
# more details on how to customize your logging configuration. 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['mail_admins'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

有些人可以帮我...

+0

我认为我们将需要看到settings.py – bigjust

+0

新增的settings.py –

+0

错误说你没有定义模板。你定义了这个模板“search/indexes/demoApp/note_text.txt”吗?搜索'另外,我们正在提供'在你已经链接的教程页面上,你会看到一个段落,告诉你为什么需要定义一个模板文件。 –

回答

1
def prepare_template(self, obj): 
    """ 
    Flattens an object for indexing. 

    This loads a template 
    (``search/indexes/{app_label}/{model_name}_{field_name}.txt``) and 
    returns the result of rendering that template. ``object`` will be in 
    its context. 
    """ 
    if self.instance_name is None and self.template_name is None: 
     raise SearchFieldError("This field requires either its instance_name variable to be populated or an explicit template_name in order to load the correct template.") 

    if self.template_name is not None: 
     template_names = self.template_name 

     if not isinstance(template_names, (list, tuple)): 
      template_names = [template_names] 
    else: 
     template_names = ['search/indexes/%s/%s_%s.txt' % (obj._meta.app_label, obj._meta.module_name, self.instance_name)] 

    t = loader.select_template(template_names) 
    return t.render(Context({'object': obj})) 

以上是使装载模板的代码。

'search/indexes/%s/%s_%s.txt' 

模板搜索路径上面(格式化了名称)。

在您的应用程序的模板目录创建如下结构:

'search/indexes/{app-name}/note_text.txt'

0

你定义了文件系统加载器,但忘了在TEMPLATE_DIRS中定义模板目录。

,或者你可以在应用程序目录下的移动模板,代替模板/

+0

Django就app文件夹下的默认模板文件夹.....如果不定义.....如果是这样的话....因为我已经提到过,我能够打开search.html这是在搜索DIR模板内的文件夹在我的应用程序没有.....定义它....反正我想你的解决方案,但同样的问题...如果我将数据插入我的数据库,并尝试rebuild_index我得到同样的错误...... –

1
class PersonIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True, template_name="person_text.txt") 
    name = indexes.CharField(model_attr='name') 

    def get_model(self): 
     return Person 

必须添加模板的名称,否则将使用默认路径。

template_name="person_text.txt"