bgneal@943
|
1 """Custom Haystack SearchFields."""
|
bgneal@943
|
2
|
bgneal@943
|
3 import haystack.fields
|
bgneal@943
|
4
|
bgneal@943
|
5
|
bgneal@943
|
6 class MaxTermSizeCharField(haystack.fields.CharField):
|
bgneal@943
|
7 """A CharField that discards large terms when preparing the search index.
|
bgneal@943
|
8
|
bgneal@943
|
9 Some backends (e.g. Xapian) throw errors when terms are bigger than some
|
bgneal@943
|
10 limit. This field omits the terms over a limit when preparing the data for
|
bgneal@943
|
11 the search index.
|
bgneal@943
|
12
|
bgneal@943
|
13 The keyword argument max_term_size sets the maximum size of a whitespace
|
bgneal@943
|
14 delimited word/term. Terms over this size are not indexed. The default value
|
bgneal@943
|
15 is 64.
|
bgneal@943
|
16 """
|
bgneal@943
|
17 DEFAULT_MAX_TERM_SIZE = 64
|
bgneal@943
|
18
|
bgneal@943
|
19 def __init__(self, *args, **kwargs):
|
bgneal@943
|
20 self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE)
|
bgneal@943
|
21 super(MaxTermSizeCharField, self).__init__(*args, **kwargs)
|
bgneal@943
|
22
|
bgneal@943
|
23 def prepare(self, obj):
|
bgneal@943
|
24 text = super(MaxTermSizeCharField, self).prepare(obj)
|
bgneal@943
|
25 if text is None or self.max_term_size is None:
|
bgneal@943
|
26 return text
|
bgneal@943
|
27
|
bgneal@943
|
28 terms = (term for term in text.split() if len(term) <= self.max_term_size)
|
bgneal@943
|
29 return u' '.join(terms)
|