bgneal@943: """Custom Haystack SearchFields.""" bgneal@943: bgneal@943: import haystack.fields bgneal@943: bgneal@943: bgneal@943: class MaxTermSizeCharField(haystack.fields.CharField): bgneal@943: """A CharField that discards large terms when preparing the search index. bgneal@943: bgneal@943: Some backends (e.g. Xapian) throw errors when terms are bigger than some bgneal@943: limit. This field omits the terms over a limit when preparing the data for bgneal@943: the search index. bgneal@943: bgneal@943: The keyword argument max_term_size sets the maximum size of a whitespace bgneal@943: delimited word/term. Terms over this size are not indexed. The default value bgneal@943: is 64. bgneal@943: """ bgneal@943: DEFAULT_MAX_TERM_SIZE = 64 bgneal@943: bgneal@943: def __init__(self, *args, **kwargs): bgneal@943: self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE) bgneal@943: super(MaxTermSizeCharField, self).__init__(*args, **kwargs) bgneal@943: bgneal@943: def prepare(self, obj): bgneal@943: text = super(MaxTermSizeCharField, self).prepare(obj) bgneal@943: if text is None or self.max_term_size is None: bgneal@943: return text bgneal@943: bgneal@943: terms = (term for term in text.split() if len(term) <= self.max_term_size) bgneal@943: return u' '.join(terms)