示例#1
0
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
示例#2
0
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)
示例#3
0
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)
示例#4
0
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)
示例#5
0
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