Как настроить Django + haystack + elasticsearch?

Добрый день,
Изучаю django, пилю блог. решил добавить поиск. Использую haystack + elasticsearch.
Вроде бы все сделал по документации, но все равно не получается реализовать. В самом низу есть ссылка на исходники. Я уверен, что проблема тривиальна и я ее не вижу из-за не опытности.

При заходе на страницу search.html ввожу в поле часть названия статьи выводит сообщение что результатов нет.
Единственное что я заметил необычного, это что при обновлении индексов выводит сообщение что ничего не обновилось и ругается на тайм зону.

python manage.py update_index
/home/oleg/.virtualenvs/test/lib/python3.4/site-packages/django/db/models/fields/__init__.py:1278: RuntimeWarning: DateTimeField Post.datetime received a naive datetime (2015-08-04 10:35:48.135647) while time zone support is active.
  RuntimeWarning)

Indexing 0 posts


Но если я убираю строку из search_indexes.py
def index_queryset(self, using=None):
       """Used when the entire index for model is updated."""
       return self.get_model().objects.filter(datetime=datetime.datetime.now())


то обновление идексов происходит
python manage.py update_index
Indexing 5 posts

но даже при индексации, все равно поиск не происходит.

вот исходники:

models.py
class Post(models.Model):
    title = models.CharField(max_length=255) # title of post
    datetime = models.DateTimeField(u'Дата публикации') # date of post
    content = models.TextField(max_length=10000) # text of post
    background_image = models.ImageField(upload_to="pics/", verbose_name=u"Your image", help_text="150x150", null=True)
    
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return '%i/' % self.id


views.py
class MySearchView(SearchView):
    template_name = "blog/search.html"
    def get_queryset(self):
        queryset = super(MySearchView, self).get_queryset()
        return queryset.filter(pub_date__gte=date(2015, 1, 1))

    def get_context_data(self, *args, **kwargs):
        context = super(MySearchView, self).get_context_data(*args, **kwargs)
        return context


search_indexes.py
from haystack import indexes
from .models import Post
import datetime

class PostIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    content = indexes.CharField(model_attr='content')

    def get_model(self):
        return Post

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


search.html

<form type="get" action=".">
    <input type="text" name="q">
    <button type="submit">Search</button>
</form>

 {% if query %}
    {% for post in posts %}
        <h1>{{ post.title }}</h1>
        <p>{{ post.content }}</p>
    {% empty %}
        <p>No results found.</p>
    {% endfor %}
{% endif %}


utls.py

urlpatterns = patterns('',  
  url(r'^search/?$', MySearchView.as_view(), name='search'),
)


древо файлов в проекте:
├── blog
│   ├── images
│   ├── templates
│   │   ├── blog
│   │   │   ├── base.html
│   │   │   ├── post_detail.html
│   │   │   ├── post_list.html
│   │   │   └── search.html
│   │   ├── __init__.py
│   │   └── search
│   │       └── indexes
│   │           └── blog
│   │               └── post_text.txt
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── search_indexes.py
│   ├── admin.py
│   ├── forms.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── media
├── mysiteblog
└── static


Вот ссылка на сами исходники, дабы было проще понять.
https://drive.google.com/file/d/0B4Taa_ekRbyAWEJtc...
  • Вопрос задан
  • 1665 просмотров
Пригласить эксперта
Ответы на вопрос 1
winordie
@winordie
Лучшая документация -- исходники
search_indexes.py
from haystack import indexes
from .models import Post
from django.utils import timezone

class PostIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    content = indexes.CharField(model_attr='content')

    def get_model(self):
        return Post

    def index_queryset(self, using=None):
       """Used when the entire index for model is updated."""
       return self.get_model().objects.filter(datetime__lte=timezone.now())
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы