def search(self, query_string, sort_by=None, start_offset=0, end_offset=None, fields='', highlight=False, facets=None, date_facets=None, query_facets=None, narrow_queries=None, spelling_query=None, limit_to_registered_models=None, **kwargs): hits = 0 results = [] if query_string: for model in self.site.get_indexed_models(): if query_string == '*': qs = model.objects.all() else: for term in query_string.split(): queries = [] for field in model._meta._fields(): if hasattr(field, 'related'): continue if not field.get_internal_type() in ( 'TextField', 'CharField', 'SlugField'): continue queries.append( Q(**{'%s__icontains' % field.name: term})) qs = model.objects.filter( reduce(lambda x, y: x | y, queries)) hits += len(qs) for match in qs: del match.app_label del match.model_name result = SearchResult(match._meta.app_label, match._meta.module_name, match.pk, 0, **match.__dict__) # For efficiency. result._model = match.__class__ result._object = match results.append(result) return { 'results': results, 'hits': hits, }
def iterator(self): for match in QuerySet.iterator(self): obj = match.content_object if obj is None: continue kwargs = dict() for key, value in match.document.iteritems(): kwargs[str(key)] = value result = SearchResult(obj._meta.app_label, obj._meta.module_name, obj.pk, 0, **kwargs) # For efficiency. result._model = obj.__class__ result._object = obj yield result
def search(self, query_string, sort_by=None, start_offset=0, end_offset=None, fields='', highlight=False, facets=None, date_facets=None, query_facets=None, narrow_queries=None, spelling_query=None, limit_to_registered_models=None, **kwargs): hits = 0 results = [] if query_string: for model in self.site.get_indexed_models(): if query_string == '*': qs = model.objects.all() else: for term in query_string.split(): queries = [] for field in model._meta._fields(): if hasattr(field, 'related'): continue if not field.get_internal_type() in ('TextField', 'CharField', 'SlugField'): continue queries.append(Q(**{'%s__icontains' % field.name: term})) qs = model.objects.filter(reduce(lambda x, y: x|y, queries)) hits += len(qs) for match in qs: del match.app_label del match.model_name result = SearchResult(match._meta.app_label, match._meta.module_name, match.pk, 0, **match.__dict__) # For efficiency. result._model = match.__class__ result._object = match results.append(result) return { 'results': results, 'hits': hits, }