Sei sulla pagina 1di 25

Haystack

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

Datastore usado por el engine Similar a un document store


Un registro en nuestro ndice En general contiene un bloque de texto que sirve como el contenido primario para las bsquedas Usualmente con metadata adicional

Documento

Por qu tener una bsqueda personalizada?


O por qu no usar Google?

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

Hmm... bien, y por qu Haystack?

Algunas razones

API familiar Pluggable Backends Integracin con third-party apps Buena documentacin! Aceptable test coverage

Aj... y en la prctica, cmo funciona esto?

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:

Data In: SearchIndex Data Out: SearchQuerySet

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

`use_template=True`? Podemos usar templates para preparar los datos:


# search/indexes/myapp/entry_text.txt {{ obj.title }} {{ obj.author.get_full_name }} {{ obj.tease }} {{ obj.content }}

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

More like this


http://docs.haystacksearch.org/dev/templatetags.html#more-like-this

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

Potrebbero piacerti anche