Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No results in Django Haystack search

I've read the getting started documentation and several other examples on the web. And this is what my search_indexes.py looks like:

from haystack.indexes import *
from haystack import site
from models import Entry

class EntryIndex(SearchIndex):
    text = CharField(document=True)
    headline = CharField(model_attr='headline')
    subheadline = CharField(model_attr='subheadline')
    category = CharField(model_attr='category__name')

    author = CharField(model_attr='get_author')
    email = CharField(model_attr='get_email')

    tags = CharField(model_attr='tags')

    content = CharField(model_attr='content')

    def get_queryset(self):
        return Entry.objects.exclude(dt_published=None).order_by('-is_featured', '-dt_published', '-dt_written', 'headline')

site.register(Entry, EntryIndex)

But when I search, I get no results. Strangely though if I use the search phrase 'a' or any other single letter, I get what looks like every single entry in the damn thing.

Anyway... It looks to me like the search engine isn't looking in any of the fields. :/

Anything below this line is less relevant (it works, trust me):


My view:

from haystack.views import SearchView

class CustomSearchView(SearchView):
    def __name__(self):
        return "CustomSearchView"

    def extra_context(self):
        return common(self.request)

def search(request):
    return CustomSearchView(template='news/search_results.html')(request)

And search_results.html:

{% extends "content.html" %}
{% load tagging_tags %}
{% load highlight %}


{% block title %}Viðskiptablaðið - Leitarniðurstöður{% endblock %}

{% block left_content %}

<h2>Search</h2>

<form method="get">
    <table>
        {{ form.as_table }}
        <tr>
            <td>&nbsp;</td>
            <td>
                <input type="submit" value="Search">
            </td>
        </tr>
    </table>

    {% if query %}
        <h3>Results</h3>

        {% for result in page.object_list %}
            {% highlight result.summary with request.GET.q %}
            {% highlight result.object.headline with request.GET.q %}
            <p>
                <a href="{{ result.object.get_absolute_url }}">{{ result.object.headline }}</a>
            </p>
        {% empty %}
            <p>No results found.</p>
        {% endfor %}

        {% if page.has_previous or page.has_next %}
            <div>
                {% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %}
                |
                {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %}
            </div>
        {% endif %}
    {% else %}
        {# Show some example queries to run, maybe query syntax, something else? #}
    {% endif %}
</form>

{% endblock %}
like image 345
demux Avatar asked Oct 01 '10 16:10

demux


1 Answers

ok, it is in the documentation but I feel it's not clear enough.

What you have to do is to declare somehow the data to be searched (i thought that was the whole point of:

headline = CharField(model_attr='headline')
subheadline = CharField(model_attr='subheadline')

etc...)

ok, enough crying.

All you have to do is

text = CharField(document=True, use_template=True)

and then make a template, in my case:

search/indexes/news/entry_text.txt

{{ object.headline }}
{{ object.subheadline }}
{{ object.get_author }}
{{ object.get_email }}
{{ object.category.name }}
{{ object.tags }}
{{ object.content }}

Beautiul, it works.

like image 153
demux Avatar answered Nov 13 '22 10:11

demux