Install and setup Haystack search for Django

So Mysql is crap at doing full text search. So in one of my projects i use Haystack so i can do full text searches.

I have a running Django project up and this is how I setup haystack for my project.

 

Install and config

sudo pip install django-haystack

 

in settings.py under INSTALLED_APPS add haystack

'haystack',

 

And also in settings.py file add some haystack settings

import os
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
        'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
    },
}

 

I have a model that looks like this

from django.db import models
# Create your models here.
class Register(models.Model):
 name = models.CharField(max_length=255)
 taxed = models.CharField(max_length=100)
 kapital = models.CharField(max_length=100)
 year = models.CharField(max_length=100)
 location = models.CharField(max_length=100)

 

Then I have an search index that that matches my model

import datetime
from haystack import indexes
from search.models import Register
class RegisterIndex(indexes.SearchIndex, indexes.Indexable):
 text = indexes.CharField(document=True,model_attr='name')
 taxed = indexes.CharField(model_attr='taxed')
 kapital = indexes.CharField(model_attr='kapital')
 location = indexes.CharField(model_attr='location')
def get_model(self):
 return Register
def index_queryset(self, using=None):
 """Used when the entire index for model is updated."""
 return self.get_model().objects.all()

 

Make it work

Sync up you database sett you mysql settings in settings.py and the run this command so that django can setup your database.

python manage.py syncd

Adding a lot of DATA to your tabel

build you index

python manage.py rebuild_index
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.
Indexing 130 registers

 

And then when you want to update your index you run

python manage.py update_index

So the last thing is to setup some views so I can search fulltext. This is my functions and its a ajax request from my webbapp. And it returns the data

 

def ajaxsearch(request):
 if request.method == 'POST':
 search=request.POST['search']
 location=request.POST['location']
 search_answer = SearchQuerySet().filter(text=search).filter(town=location)
 return render_to_response('test.html',{'search': search_answer},context_instance=RequestContext(request))

and here is the template that prints the data

 

{% for r in search %}
 <div class='alert alert-info'><button type='button' class='close' data-dismiss='alert'>&times;</button><strong>{{ r.text }} {{ r.location }}</strong> <br> <b>{{ r.taxed }}</b>
{% endfor %}

Leave a Reply

%d bloggers like this: