I'm trying to implement yielding results for a searching only a part of a word (which is called autocomplete according to the Haystack docs if I'm not mistaken).
Example:
Search "gol"
Result "goldfish"
What have I tried?
I did as asked in step 1 of the docs, I added the following line in my Index class:
content_auto = indexes.EdgeNgramField(model_attr='content')
Then did python manage.py rebuild_index.
Rebuilding the index however produced an error haystack.exceptions.SearchFieldError: The model '<Person: Reginald>' does not have a model_attr 'content'. With Reginald being the first entry in my indexed table and Person being the model I indexed.
Now indeed my model doesn't have a field called content but as it is shown in the docs it should not need to have such a field.
I am using Whoosh 2.4.1, Django-haystack 1.2.7 and Django 1.4.
So this is how I'm solving this right now.
Instead of:
content_auto = indexes.EdgeNgramField(model_attr='content')
Use:
content_auto = indexes.EdgeNgramField(use_template=True)
Then you can create a template for these. For example, I have an ItemIndex in my catalog app, where I want to search name and description. So, I made a file in templates/search/indexes/catalog/ called item_content_auto.txt, which has the following in it:
{{ object.name }}
{{ object.description }}
This seems to be functioning how I want it to. A little more tedious than if 'content' worked, but it should suffice.
Here is an updated example for reference (see here):
#search_indexes.py
class Book(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
def get_model(self):
return Book
#template
{{object.name}}
#query
SearchQuerySet().autocomplete(text=my_query)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With