干草堆索引错误

时间:2013-07-12 05:40:02

标签: python django elasticsearch django-haystack

我正在尝试实施haystack tutorial: 但是我遇到了问题:

如果我的数据库中已有数据并尝试使用以下方法构建索引:

python manage.py rebuild_index它出现以下错误:

vaibhav@ubuntu:~/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

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

vaibhav@ubuntu:~/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结构:

vaibhav@ubuntu:~/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', 'your_email@example.com'),
)

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,
        },
    }
}

有些人可以帮助我......

4 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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'

答案 2 :(得分:0)

您定义了文件系统加载器,但忘记在TEMPLATE_DIRS中定义templates目录。

或者您可以将模板移动到app目录下,而不是模板/

答案 3 :(得分:0)

我遇到了类似的问题。问题是我没有在模板目录中添加文件。在模板文件夹之一中添加“ search / indexes / demoApp / note_text.txt”文件。如果您使用的是pycharm,则转到Pycharm->首选项->语言和框架-> Django->显示结构,它将显示如下屏幕,您可以检查模板文件夹。因此,在您的应用程序模板文件夹中创建目录结构“ search / indexes / demoApp”,然后在其中添加该文件。 show Structure path

show Structure with template folders