I have a Django project that uses SOLR for indexing.
I\'m trying to do a substring search using Haystack\'s SearchQuerySet
It's a bug in haystack.
As you said, __exact
is implemented exactly like __contains
and therefore this functionality does not exists out of the box in haystack.
The fix is awaiting merge here: https://github.com/django-haystack/django-haystack/issues/1041
You can bridge the waiting time for a fixed release like this:
from haystack.inputs import BaseInput, Clean
class CustomContain(BaseInput):
"""
An input type for making wildcard matches.
"""
input_type_name = 'custom_contain'
def prepare(self, query_obj):
query_string = super(CustomContain, self).prepare(query_obj)
query_string = query_obj.clean(query_string)
exact_bits = [Clean(bit).prepare(query_obj) for bit in query_string.split(' ') if bit]
query_string = u' '.join(exact_bits)
return u'*{}*'.format(query_string)
# Usage:
SearchQuerySet().filter(content=CustomContain('searchcontentgoeshere'))
That could be done using EdgeNgramField field:
some_field = indexes.EdgeNgramField() # also prepare value for this field or use model_attr
Then for partial match:
SearchQuerySet().all().filter(some_field='ear')