В большинстве проектов так или иначе требуется поиск. И тут, на мой взгляд, есть варианта действий:
- написать свой поиск;
- скормить сайт какой-нибудь поисковой системе;
- воспользоваться готовым решением.
Первый вариант я бы отмел сразу - относительно просто до тех пор пока трафик на вашем ресурсе не пойдет вверх, тогда вам придется думать о хешировании, кешировании и прочих прелестях.
Скормить сайт поисковику, на мой взгляд, самый правильный вариант, но что делать если вы пишите внутреннее приложение без доступа извне?
Немного погуглив на эту тему, наткнулся на весьма интересный проект для
Django:
Haystack. То, что меня сразу "зацепило" а.к.а. возможности из коробки:
- индексирование;
- настраиваемые поисковые формы;
- настраиваемые поисковые представления.
Еще одна вещь мне была поначалу непонятна: настраиваемые шаблоны для поиска. Как оказалось именно в этих шаблонах вся "фишка" haystack. Эти шаблоны никому никогда не показываются, но именно они индексируются.
Итак, давайте поподробнее посмотрим как это работает. Пусть имеется приложение blogs и следующие модели:
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
def __unicode__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateTimeField()
mod_date = models.DateTimeField()
author = models.ForeignKey(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __unicode__(self):
return self.headline
Искать надо, скажем, записи (
Entry), но пусть также находятся записи где поисковый запрос соответствует имени или email'у автора, а также названию или тегу блога. Т.е. поиск должен происходить не только по модели
Entry, но и по
Blog и
Author. Вот тут нам и помогут те самые настраиваемые шаблоны для поиска.
Для этого создаем файл
search_indexes.py в папке с приложением следующего содержания:
from haystack.indexes import *
from haystack import site
from blogs import models
class EntryIndex(RealTimeSearchIndex):
# специальное поле - должно быть только одно в модели
text = CharField(document=True, use_template=True)
# поля из модели Entry
headline = CharField(model_attr='headline')
body_text = TextField(model_attr='body_text')
# поля модели Blog
blog_name = CharField(model_attr='blog__name')
blog_tagline = CharField(model_attr='blog__tagline')
# поля модели Author
author_name = CharField(model_attr='author__name')
author_email = CharField(model_attr='author__email')
site.register(models.Entry, EntryIndex)
Теперь необходимо создать сам шаблон