def search_file(request, query, project=None, version=LATEST, taxonomy=None): kwargs = {} body = { "query": { "bool": { "should": [ {"match": {"title": {"query": query, "boost": 10}}}, {"match": {"headers": {"query": query, "boost": 5}}}, {"match": {"content": {"query": query}}}, ] } }, "facets": { "taxonomy": { "terms": {"field": "taxonomy"}, }, "project": { "terms": {"field": "project"}, }, "version": { "terms": {"field": "version"}, }, }, "highlight": { "fields": { "title": {}, "headers": {}, "content": {}, } }, "fields": ["title", "project", "version", "path"], "size": 50 # TODO: Support pagination. } if project or version or taxonomy: final_filter = {"and": []} if project: final_filter['and'].append({'term': {'project': project}}) # Add routing to optimize search by hitting the right shard. kwargs['routing'] = project if version: final_filter['and'].append({'term': {'version': version}}) if taxonomy: final_filter['and'].append({'term': {'taxonomy': taxonomy}}) body['filter'] = final_filter body['facets']['project']['facet_filter'] = final_filter body['facets']['version']['facet_filter'] = final_filter body['facets']['taxonomy']['facet_filter'] = final_filter before_file_search.send(request=request, sender=PageIndex, body=body) results = PageIndex().search(body, **kwargs) return results
def search_file(request, query, project_slug=None, version_slug=LATEST, taxonomy=None): """Search index for files matching query Raises a 404 error on missing project :param request: request instance :param query: string to query for :param project_slug: :py:class:`Project` slug :param version_slug: slug for :py:class:`Project` version slug :param taxonomy: taxonomy for search """ kwargs = {} body = { "query": { "bool": { "should": [ { "match_phrase": { "title": { "query": query, "boost": 10, "slop": 2, }, } }, { "match_phrase": { "headers": { "query": query, "boost": 5, "slop": 3, }, } }, { "match_phrase": { "content": { "query": query, "slop": 5, }, } }, ] } }, "facets": { "taxonomy": { "terms": { "field": "taxonomy" }, }, "project": { "terms": { "field": "project" }, }, "version": { "terms": { "field": "version" }, }, }, "highlight": { "fields": { "title": {}, "headers": {}, "content": {}, } }, "fields": ["title", "project", "version", "path"], "size": 50 # TODO: Support pagination. } if project_slug or version_slug or taxonomy: final_filter = {"and": []} if project_slug: try: project = (Project.objects.api( request.user).get(slug=project_slug)) project_slugs = [project.slug] # We need to use the obtuse syntax here because the manager # doesn't pass along to ProjectRelationships project_slugs.extend( s.slug for s in Project.objects.public(request.user).filter( superprojects__parent__slug=project.slug)) final_filter['and'].append( {"terms": { "project": project_slugs }}) # Add routing to optimize search by hitting the right shard. # This purposely doesn't apply routing if the project has more # than one parent project. if project.superprojects.exists(): if project.superprojects.count() == 1: kwargs['routing'] = ( project.superprojects.first().parent.slug) else: kwargs['routing'] = project_slug except Project.DoesNotExist: return None if version_slug: final_filter['and'].append({'term': {'version': version_slug}}) if taxonomy: final_filter['and'].append({'term': {'taxonomy': taxonomy}}) body['filter'] = final_filter body['facets']['project']['facet_filter'] = final_filter body['facets']['version']['facet_filter'] = final_filter body['facets']['taxonomy']['facet_filter'] = final_filter if settings.DEBUG: print("Before Signal") pprint(body) before_file_search.send(request=request, sender=PageIndex, body=body) if settings.DEBUG: print("After Signal") pprint(body) return PageIndex().search(body, **kwargs)
def search_file(request, query, project_slug=None, version_slug=LATEST, taxonomy=None): """Search index for files matching query Raises a 404 error on missing project :param request: request instance :param query: string to query for :param project_slug: :py:class:`Project` slug :param version_slug: slug for :py:class:`Project` version slug :param taxonomy: taxonomy for search """ kwargs = {} body = { "query": { "bool": { "should": [ {"match_phrase": { "title": { "query": query, "boost": 10, "slop": 2, }, }}, {"match_phrase": { "headers": { "query": query, "boost": 5, "slop": 3, }, }}, {"match_phrase": { "content": { "query": query, "slop": 5, }, }}, ] } }, "facets": { "taxonomy": { "terms": {"field": "taxonomy"}, }, "project": { "terms": {"field": "project"}, }, "version": { "terms": {"field": "version"}, }, }, "highlight": { "fields": { "title": {}, "headers": {}, "content": {}, } }, "fields": ["title", "project", "version", "path"], "size": 50 # TODO: Support pagination. } if project_slug or version_slug or taxonomy: final_filter = {"and": []} if project_slug: try: project = (Project.objects .api(request.user) .get(slug=project_slug)) project_slugs = [project.slug] # We need to use the obtuse syntax here because the manager # doesn't pass along to ProjectRelationships project_slugs.extend(s.slug for s in Project.objects.public( request.user).filter( superprojects__parent__slug=project.slug)) final_filter['and'].append({"terms": {"project": project_slugs}}) # Add routing to optimize search by hitting the right shard. # This purposely doesn't apply routing if the project has more # than one parent project. if project.superprojects.exists(): if project.superprojects.count() == 1: kwargs['routing'] = (project.superprojects.first() .parent.slug) else: kwargs['routing'] = project_slug except Project.DoesNotExist: return None if version_slug: final_filter['and'].append({'term': {'version': version_slug}}) if taxonomy: final_filter['and'].append({'term': {'taxonomy': taxonomy}}) body['filter'] = final_filter body['facets']['project']['facet_filter'] = final_filter body['facets']['version']['facet_filter'] = final_filter body['facets']['taxonomy']['facet_filter'] = final_filter if settings.DEBUG: print "Before Signal" pprint(body) before_file_search.send(request=request, sender=PageIndex, body=body) if settings.DEBUG: print "After Signal" pprint(body) return PageIndex().search(body, **kwargs)
def search_file( request, query, project_slug=None, version_slug=LATEST, taxonomy=None, ): """ Search index for files matching query. Raises a 404 error on missing project :param request: request instance :param query: string to query for :param project_slug: :py:class:`Project` slug :param version_slug: slug for :py:class:`Project` version slug :param taxonomy: taxonomy for search """ kwargs = {} body = { 'query': { 'bool': { 'should': [ { 'match_phrase': { 'title': { 'query': query, 'boost': 10, 'slop': 2, }, }, }, { 'match_phrase': { 'headers': { 'query': query, 'boost': 5, 'slop': 3, }, }, }, { 'match_phrase': { 'content': { 'query': query, 'slop': 5, }, }, }, ], }, }, 'facets': { 'taxonomy': { 'terms': { 'field': 'taxonomy' }, }, 'project': { 'terms': { 'field': 'project' }, }, 'version': { 'terms': { 'field': 'version' }, }, }, 'highlight': { 'fields': { 'title': {}, 'headers': {}, 'content': {}, }, }, 'fields': ['title', 'project', 'version', 'path'], 'size': 50, # TODO: Support pagination. } if project_slug or version_slug or taxonomy: final_filter = {'and': []} if project_slug: try: project = (Project.objects.api( request.user).get(slug=project_slug)) project_slugs = [project.slug] # We need to use the obtuse syntax here because the manager # doesn't pass along to ProjectRelationships project_slugs.extend( s.slug for s in Project.objects.public(request.user, ).filter( superprojects__parent__slug=project.slug, )) final_filter['and'].append({ 'terms': { 'project': project_slugs }, }) # Add routing to optimize search by hitting the right shard. # This purposely doesn't apply routing if the project has more # than one parent project. if project.superprojects.exists(): if project.superprojects.count() == 1: kwargs['routing'] = ( project.superprojects.first().parent.slug) else: kwargs['routing'] = project_slug except Project.DoesNotExist: return None if version_slug: final_filter['and'].append({'term': {'version': version_slug}}) if taxonomy: final_filter['and'].append({'term': {'taxonomy': taxonomy}}) body['filter'] = final_filter body['facets']['project']['facet_filter'] = final_filter body['facets']['version']['facet_filter'] = final_filter body['facets']['taxonomy']['facet_filter'] = final_filter if settings.DEBUG: print('Before Signal') pprint(body) before_file_search.send(request=request, sender=PageIndex, body=body) if settings.DEBUG: print('After Signal') pprint(body) return PageIndex().search(body, **kwargs)
def search_file(request, query, project=None, version=LATEST, taxonomy=None): kwargs = {} body = { "query": { "bool": { "should": [ { "match": { "title": { "query": query, "boost": 10 } } }, { "match": { "headers": { "query": query, "boost": 5 } } }, { "match": { "content": { "query": query } } }, ] } }, "facets": { "taxonomy": { "terms": { "field": "taxonomy" }, }, "project": { "terms": { "field": "project" }, }, "version": { "terms": { "field": "version" }, }, }, "highlight": { "fields": { "title": {}, "headers": {}, "content": {}, } }, "fields": ["title", "project", "version", "path"], "size": 50 # TODO: Support pagination. } if project or version or taxonomy: final_filter = {"and": []} if project: final_filter['and'].append({'term': {'project': project}}) # Add routing to optimize search by hitting the right shard. kwargs['routing'] = project if version: final_filter['and'].append({'term': {'version': version}}) if taxonomy: final_filter['and'].append({'term': {'taxonomy': taxonomy}}) body['filter'] = final_filter body['facets']['project']['facet_filter'] = final_filter body['facets']['version']['facet_filter'] = final_filter body['facets']['taxonomy']['facet_filter'] = final_filter before_file_search.send(request=request, sender=PageIndex, body=body) results = PageIndex().search(body, **kwargs) return results