Mercurial > public > sg101
comparison custom_search/fields.py @ 943:cf9918328c64
Haystack tweaks for Django 1.7.7.
I had to upgrade to Haystack 2.3.1 to get it to work with Django
1.7.7. I also had to update the Xapian backend. But I ran into
problems.
On my laptop anyway (Ubuntu 14.0.4), xapian gets mad when search terms
are greater than 245 chars (or something) when indexing. So I created
a custom field that would simply omit terms greater than 64 chars and
used this field everywhere I previously used a CharField.
Secondly, the custom search form was broken now. Something changed in
the Xapian backend and exact searches stopped working. Fortunately the
auto_query (which I was using originally and broke during an upgrade)
started working again. So I cut the search form back over to doing an
auto_query. I kept the form the same (3 fields) because I didn't want
to change the form and I think it's better that way.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Wed, 13 May 2015 20:25:07 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
942:e8b170fca581 | 943:cf9918328c64 |
---|---|
1 """Custom Haystack SearchFields.""" | |
2 | |
3 import haystack.fields | |
4 | |
5 | |
6 class MaxTermSizeCharField(haystack.fields.CharField): | |
7 """A CharField that discards large terms when preparing the search index. | |
8 | |
9 Some backends (e.g. Xapian) throw errors when terms are bigger than some | |
10 limit. This field omits the terms over a limit when preparing the data for | |
11 the search index. | |
12 | |
13 The keyword argument max_term_size sets the maximum size of a whitespace | |
14 delimited word/term. Terms over this size are not indexed. The default value | |
15 is 64. | |
16 """ | |
17 DEFAULT_MAX_TERM_SIZE = 64 | |
18 | |
19 def __init__(self, *args, **kwargs): | |
20 self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE) | |
21 super(MaxTermSizeCharField, self).__init__(*args, **kwargs) | |
22 | |
23 def prepare(self, obj): | |
24 text = super(MaxTermSizeCharField, self).prepare(obj) | |
25 if text is None or self.max_term_size is None: | |
26 return text | |
27 | |
28 terms = (term for term in text.split() if len(term) <= self.max_term_size) | |
29 return u' '.join(terms) |