Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Bsqueda en Django
Qu es Haystack?
Provee bsquedas para Django API unificada y familiar Soporte para diferentes backends (Solr, Whoosh, Xapian)
Algunos conceptos
Search Engine
S, atrs tenemos un motor de bsqueda (third-party) Stemming, Inverted index Examples: Solr, Xapian, Whoosh
ndice
Documento
Algunas razones
Control de lo que est o no indexado Calidad de la informacin indexada Manejo especfico de ciertos datos Bsquedas de acuerdo al contexto
Algunas razones
API familiar Pluggable Backends Integracin con third-party apps Buena documentacin! Aceptable test coverage
Veamos...
from django.contrib.auth.models import User from django.db import models class Entry(models.Model): title = models.CharField(max_length=100) created = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(User) tease = models.TextField(blank=True) content = models.TextField() def __unicode__(self): return self.title
Y Haystack?
Distinguimos 2 etapas:
SearchIndex
Medio para introducir datos en el ndice Permite preparar los datos y definir qu se va a persistir
SearchIndex
from haystack import indexes, site from myapp.models import Entry class EntrySearchIndex(indexes.SearchIndex): text = indexes.CharField(document=True, use_template=True) author = indexes.CharField(model_attr=user__username) created = indexes.DateTimeField() def get_queryset(self): return Entry.objects.published() def prepare_created(self, obj): return obj.pub_date or datetime.datetime.now() site.register(Entry, EntrySearchIndex)
SearchIndex
SearchQuerySet
Una muy buena razn para usar Haystack Similar a QuerySet de Django Todo lo dems son wrappers alrededor de SearchQuerySet
SearchQuerySet
Obtiene datos del ndice Similar a QuerySet Es lazy Se pueden encadenar sus mtodos
SearchQuerySet
Por defecto busca entre todos los modelos Se puede restringir usando .models Mantiene cache cuando es posible
SearchQuerySet
>>> import datetime >>> from haystack.query import SearchQuerySet # This searches whatever fields were marked ``document=True``. >>> results = SearchQuerySet().filter(content='hello') [<SearchResult: myapp.entry(pk=u'3')>] >>> sqs = SearchQuerySet().models(Entry) >>> sqs = sqs.filter(created__lte=datetime.datetime.now()) >>> sqs = sqs.exclude(author=daniel) # Lazily performed the query when asked for results. >>> sqs [<SearchResult: myapp.entry (pk=u'5')>, <SearchResult: myapp.entry(pk=u'3')>, <SearchResult: myapp.entry (pk=u'2')>] # Iterable interface. Still hasnt hit the DB. >>> [result.author for result in sqs] [johndoe, sally1982, bob_the_third]
SearchQuerySet
# Hits the database once per result. >>> [result.object.user.first_name for result in sqs] [John, Sally, Bob] # More efficient loading from database (one query total). >>> [result.object.user.first_name for result in sqs.load_all()] [John, Sally, Bob]
SearchView
Class-based view Resuelve la mayora de los casos haituales Permite usos avanzados Se basa en SearchForm
SearchView (template=None, load_all=True, form_class=None, searchqueryset=None, context_class=RequestContext, results_per_page=None)
SearchForm
Es un form de Django estndar Define un mtodo search que realiza las acciones necesarias
SearchForm
from django import forms from haystack.forms import SearchForm from myapp.models import Entry class EntrySearchForm(SearchForm): # Additional fields go here. author = forms.CharField(max_length=255, required=False) def search(self): sqs = super(EntrySearchForm, self).search() if self.cleaned_data.get(author): sqs = sqs.filter(author=self.cleaned_data[author]) return sqs
Otros features
Highlighting
http://docs.haystacksearch.org/dev/highlighting.html
Faceting
http://docs.haystacksearch.org/dev/faceting.html
Boost
http://docs.haystacksearch.org/dev/boost.html
Autocomplete
http://docs.haystacksearch.org/dev/autocomplete.html
Spelling suggestions
http://docs.haystacksearch.org/dev/settings.html#haystack-include-spelling
Y lo mejor de todo...
Si lo provisto out of box no alcanza, uno usa SearchQuerySet y arma lo que necesita Despus de todo es slo Django y Python
Preguntas?
mbordese@gmail.com http://matias.bordese.com.ar
Referencias
Haystack
http://haystacksearch.org/
Documentacin
http://docs.haystacksearch.org/dev/
Source code
https://github.com/toastdriven/django-haystack/
Training Haystack
http://www.scribd.com/doc/45999520/Haystack-Training