class FakeSearch(search.ModelSearchAdapter): model = Fake fields = [ 'title^2', 'description', ] facets = { 'tag': search.TermFacet('tags'), 'other': search.TermFacet('other'), 'range': search.RangeFacet('a_num_field'), 'daterange': search.DateRangeFacet('a_daterange_field'), 'bool': search.BoolFacet('boolean'), 'extra': search.ExtrasFacet('extras'), } sorts = { 'title': search.Sort('title.raw'), 'description': search.Sort('description.raw'), }
def setUp(self): self.facet = search.BoolFacet(field='boolean')
class FakeSearchWithBool(FakeSearch): facets = { 'boolean': search.BoolFacet(field='a_bool_field') }
class OrganizationSearch(search.ModelSearchAdapter): model = Organization fuzzy = True fields = ( 'name^6', 'acronym^6', 'description', ) sorts = { 'name': search.Sort('name.raw'), 'reuses': search.Sort('metrics.reuses'), 'datasets': search.Sort('metrics.datasets'), 'followers': search.Sort('metrics.followers'), 'views': search.Sort('metrics.views'), 'created': search.Sort('created'), } facets = { 'reuses': search.RangeFacet('metrics.reuses'), 'datasets': search.RangeFacet('metrics.datasets'), 'followers': search.RangeFacet('metrics.followers'), 'public_services': search.BoolFacet('public_service'), } mapping = { 'properties': { 'name': { 'type': 'string', 'analyzer': search.i18n_analyzer, 'fields': { 'raw': { 'type': 'string', 'index': 'not_analyzed' } } }, 'acronym': { 'type': 'string', 'index': 'not_analyzed', }, 'description': { 'type': 'string', 'analyzer': search.i18n_analyzer }, 'url': { 'type': 'string' }, 'created': { 'type': 'date', 'format': 'date_hour_minute_second' }, 'metrics': search.metrics_mapping(Organization), 'org_suggest': { 'type': 'completion', 'index_analyzer': 'simple', 'search_analyzer': 'simple', 'payloads': True, }, } } boosters = [ search.BoolBooster('public_service', 1.5), search.GaussDecay('metrics.followers', max_followers, decay=0.8), search.GaussDecay('metrics.reuses', max_reuses, decay=0.9), search.GaussDecay('metrics.datasets', max_datasets, decay=0.9), ] @classmethod def is_indexable(cls, org): return org.deleted is None @classmethod def serialize(cls, organization): completions = cls.completer_tokenize(organization.name) if organization.acronym: completions.append(organization.acronym) return { 'name': organization.name, 'acronym': organization.acronym, 'description': organization.description, 'url': organization.url, 'metrics': organization.metrics, 'created': organization.created_at.strftime('%Y-%m-%dT%H:%M:%S'), 'org_suggest': { 'input': completions, 'output': organization.name, 'payload': { 'id': str(organization.id), 'acronym': organization.acronym, 'image_url': organization.logo(40), 'slug': organization.slug, }, }, 'public_service': organization.public_service or False, # TODO: extract tis into plugin }