예제 #1
0
    def search(self, config, start, stop, score_field=None):
        # TODO: Handle MatchAll nested inside other search query classes.
        if isinstance(self.query, MatchAll):
            return self.queryset[start:stop]

        search_query = self.build_database_query(config=config)
        if self.fields is None:
            vector = F('index_entries__autocomplete')
            if not self.is_autocomplete:
                vector = vector._combine(F('index_entries__body'), '||', False)
        else:
            vector = ADD(
                SearchVector(field_lookup, config=search_query.config,
                             weight=get_weight(search_field.boost))
                for field_lookup, search_field in self.search_fields.items()
                if not self.is_autocomplete or search_field.partial_match)
        rank_expression = SearchRank(vector, search_query,
                                     weights=self.sql_weights)
        queryset = self.queryset.annotate(
            _vector_=vector).filter(_vector_=search_query)
        if self.order_by_relevance:
            queryset = queryset.order_by(rank_expression.desc(), '-pk')
        elif not queryset.query.order_by:
            # Adds a default ordering to avoid issue #3729.
            queryset = queryset.order_by('-pk')
            rank_expression = F('pk')
        if score_field is not None:
            queryset = queryset.annotate(**{score_field: rank_expression})
        return queryset[start:stop]
예제 #2
0
 def get_queryset(self):
     queryset = Outcome.objects.filter(is_public=True)
     query = SearchQuery(prepare_search_term(
         self.request.GET.get('query', '')),
                         search_type='raw')
     vector = SearchVector('title', weight='A') + SearchVector(
         'description', weight='B')
     rank = SearchRank(vector, query)
     return Outcome.objects.annotate(rank=rank).filter(
         rank__gt=0.2).order_by('rank')[:20]
예제 #3
0
 def search(self, query=None):
     qs = self
     if query is not None:
         vector = SearchVector('title', weight='A') \
             + SearchVector('description', weight='B')\
             + SearchVector('slug', weight='C')
         query = SearchQuery(query)
         result = Article.objects.annotate(rank=SearchRank(vector,
                                                           query)).filter(rank__gte=0.3).order_by('rank').order_by('-rank')
     return result
예제 #4
0
 def search(self, text):
     if text == "":
         # search_rank = SearchRank(search_vectors, search_query)
         return self.get_queryset().annotate(search=search_vectors)
     else:
         search_query = SearchQuery(text, config='english')
         search_rank = SearchRank(search_vectors, search_query)
         return self.get_queryset().annotate(search=search_vectors).filter(
             search=search_query).annotate(
                 rank=search_rank).order_by('-rank')
예제 #5
0
파일: views.py 프로젝트: chibs4/new
 def get_queryset(self):
     query = self.request.GET.get('q')
     vector = SearchVector('name', weight='A') + SearchVector(
         'content', weight='C') + SearchVector('categories__name',
                                               weight='B')
     query = SearchQuery(query)
     results = Article.objects.annotate(
         rank=SearchRank(vector, query)).filter(
             rank__gte=0.2).order_by('rank')
     return results
예제 #6
0
    def get_queryset(self):
        qs = Video.objects.all()
        keywords = self.request.GET.get('q')
        if keywords:
            query = SearchQuery(keywords)
            vector = SearchVector('json', 'name')
            qs = qs.annotate(search=vector).filter(search=query)
            qs = qs.annotate(rank=SearchRank(vector, query)).order_by('-rank')

        return qs
예제 #7
0
    def get_search_results(self, request, queryset, search_term):
        if not search_term:
            return super().get_search_results(request, queryset, search_term)

        query = SearchQuery(search_term, config="portuguese")
        rank = SearchRank(F("search_vector"), query)
        queryset = (File.objects.annotate(rank=rank).filter(
            search_vector=query).order_by("-rank"))

        return queryset, False
예제 #8
0
    def search(self, search_terms):
        vector = SearchVector(
            models.F("name"), config="simple_unaccented",
            weight="A") + SearchVector(models.F("code_departement"),
                                       config="simple_unaccented",
                                       weight="B")
        query = PrefixSearchQuery(search_terms, config="simple_unaccented")

        return (self.annotate(search=vector).filter(search=query).annotate(
            rank=SearchRank(vector, query)).order_by("-rank"))
예제 #9
0
def search_users(phrase):
    """Return matching users for dashboard views."""
    sv = (SearchVector("email", weight="A") +
          SearchVector("first_name", weight="B") +
          SearchVector("last_name", weight="B") +
          SearchVector("default_billing_address__first_name", weight="B") +
          SearchVector("default_billing_address__last_name", weight="B"))
    rank = SearchRank(sv, SearchQuery(phrase))
    return User.objects.annotate(rank=rank).filter(
        rank__gte=0.2).order_by("-rank")
예제 #10
0
 def search(self, query):
     search_query = Q(
         Q(search_vector=SearchQuery(query))
     )
     return self.annotate(
         variety_headline=SearchHeadLine(F('variety'), SearchQuery(query)),
         winery_headline=SearchHeadLine(F('winery'), SearchQuery(query)),
         description_headline=SearchHeadLine(F('description'), SearchQuery(query)),
         search_rank=SearchRank(F('search_vector'), SearchQuery(query)),
     ).filter(search_query).order_by('-search_rank', 'id')
예제 #11
0
 def get_queryset(self):
     super().get_queryset()
     if 'query' in self.request.GET:
         query = self.request.GET['query']
         search_vector = SearchVector('name', 'subcategory', 'category',
                                      'body')
         search_query = SearchQuery(query)
         results = Worker.objects.annotate(search=search_vector, rank=SearchRank(search_vector, search_query)). \
             filter(search=search_query)
         return results
예제 #12
0
 def get(self, request):
     query = request.GET.get('q')
     # igts = Ingredient.objects.filter(Q(long_desc__icontains=query) | Q(short_desc__icontains=query))[:5]
     # igts = Ingredient.objects.filter(long_desc__search=query)[:5]
     body_vector = SearchVector('long_desc')
     term_query = SearchQuery(query)
     igts = Ingredient.objects.annotate(
         rank=SearchRank(body_vector, term_query))[:5]
     serializer = IngredientSerializer(igts, many=True)
     return Response(serializer.data)
예제 #13
0
    def search(self, request):
        q = request.GET['q']

        vector = SearchVector('tip', weight='A')
        query = SearchQuery(q, search_type='phrase')
        rank = SearchRank(vector, query)
        tweets = Tweet.objects.annotate(rank=rank).filter(
            rank__gte=0.3).order_by('-rank')
        serializer = TweetSerializerSearch(tweets, many=True)
        return Response({'items': serializer.data})
예제 #14
0
파일: views.py 프로젝트: pdelcol/PawPrints
def search(query):
    vector = SearchVector('title', weight='A') + \
        SearchVector('description', weight='A')
    query = SearchQuery(query)
    return Petition.objects.annotate(rank=SearchRank(vector, query)) \
        .select_related('author', 'response') \
        .prefetch_related('tags', 'updates') \
        .filter(status=1) \
        .filter(rank__gte=0.35) \
        .order_by('-rank')[:45]
예제 #15
0
 def search_by_name(self, search_text, objects=None):
     vector = SearchVector("name")
     query = SearchQuery(search_text)
     if not objects:
         objects = self.get_queryset()
     return (
         objects.annotate(search=vector, rank=SearchRank(vector, query))
         .filter(search=search_text)
         .order_by("-rank")
     )
예제 #16
0
    def search(self, termes: str):
        """Réalise une recherche plein texte dans le queryset

        :param termes: Les termes à rechercher
        :return: le queryset filtré et ordonné selon les termes à rechercher
        """
        query = PrefixSearchQuery(termes, config="data_france_search")

        return (self.filter(search=query).annotate(
            rank=SearchRank(models.F("search"), query)).order_by("-rank"))
예제 #17
0
 def get_can_help(self, query=""):
     results = Experience.objects.filter(
         profile=self, exp_type=Experience.Type.CAN_HELP).order_by("-level")
     if query:
         vector = SearchVector("skill__skill")
         or_query = SearchQuery(query.replace(" ", " | "),
                                search_type="raw")
         results = results.annotate(rank=SearchRank(vector, or_query))
         results = results.order_by("-rank")
     return results
예제 #18
0
def search_users(phrase):
    """Return matching users for dashboard views."""
    sv = (SearchVector('email', weight='A') +
          SearchVector('first_name', weight='B') +
          SearchVector('last_name', weight='B') +
          SearchVector('default_billing_address__first_name', weight='B') +
          SearchVector('default_billing_address__last_name', weight='B'))
    rank = SearchRank(sv, SearchQuery(phrase))
    return User.objects.annotate(rank=rank).filter(
        rank__gte=0.2).order_by('-rank')
예제 #19
0
def filter_datasets(
    datasets: Union[ReferenceDataset, DataSet],
    query,
    source,
    use=None,
    user=None,
    form=None,
):
    search = SearchVector('name', 'short_description', config='english')
    search_query = SearchQuery(query, config='english')

    dataset_filter = Q(published=True)

    if user:
        if datasets.model is ReferenceDataset:
            reference_type = DataSetType.REFERENCE.value
            reference_perm = dataset_type_to_manage_unpublished_permission_codename(
                reference_type)

            if user.has_perm(reference_perm):
                dataset_filter |= Q(published=False)

        if datasets.model is DataSet:
            master_type, datacut_type = (
                DataSetType.MASTER.value,
                DataSetType.DATACUT.value,
            )
            master_perm = dataset_type_to_manage_unpublished_permission_codename(
                master_type)
            datacut_perm = dataset_type_to_manage_unpublished_permission_codename(
                datacut_type)

            if user.has_perm(master_perm) and (not use
                                               or str(master_type) in use):
                dataset_filter |= Q(published=False, type=master_type)

            if user.has_perm(datacut_perm) and (not use
                                                or str(datacut_type) in use):
                dataset_filter |= Q(published=False, type=datacut_type)

    datasets = datasets.filter(dataset_filter).annotate(search=search,
                                                        search_rank=SearchRank(
                                                            search,
                                                            search_query))

    if query:
        datasets = datasets.filter(search=query)

    if source:
        datasets = datasets.filter(source_tags__in=source)

    if use:
        datasets = datasets.filter(type__in=use)

    return datasets
예제 #20
0
def search(request):
    # print("in search function")
    ctx = {}
    query_param = str(request.GET.get("q1"))
    search_cat = str(request.GET.get("q2", 'all')).lower()
    if query_param not in [None, "", " "]:
        query_param = str(query_param.strip())
        if (search_cat in ['all', 'search_options']):
            # medicines = medicineDetail.objects.annotate(search=SearchVector('sku_name', 'manufacturer_name', 'salt_name')).filter(
            #     search=query_param)
            vector = SearchVector('sku_name', weight='A') + SearchVector(
                'manufacturer_name', weight='B') + SearchVector('salt_name',
                                                                weight='C')
            query = SearchQuery(query_param)

            medicines = medicineDetail.objects.annotate(
                # similarity=TrigramSimilarity(
                #     'sku_name', query_param
                # )*0.5 + TrigramSimilarity(
                #     'manufacturer_name', query_param
                # )*0.4 + TrigramSimilarity(
                #     'salt_name', query_param
                # )*0.1,
                distance=TrigramDistance('sku_name', query_param) * 0.5 +
                TrigramDistance('manufacturer_name', query_param) * 0.4 +
                TrigramDistance('salt_name', query_param) * 0.1,
                rank=SearchRank(vector, query)).order_by('distance')[:20]
            print(medicines)
        elif search_cat == 'product_name':
            medicines = medicineDetail.objects.annotate(distance=TrigramDistance('sku_name', query_param)) \
                .order_by('distance')[:20]
            # print(medicines)
        elif search_cat == 'manufacturer_name':
            # print("in manu fac")
            medicines = medicineDetail.objects.annotate(
                distance=TrigramDistance('manufacturer_name', query_param
                                         )).order_by('distance')[:20]
            # print(medicines)
        elif search_cat == 'salt_name':
            medicines = medicineDetail.objects.annotate(distance=TrigramDistance('salt_name', query_param)) \
                .order_by('distance')[:20]
    else:
        medicines = medicineDetail.objects.none()

    ctx["medicines"] = medicines
    # print(ctx)
    if request.is_ajax():
        html = render_to_string(
            template_name="navia_home/medicines-results-partial.html",
            context={"medicines": medicines})
        data_dict = {"html_from_view": html}
        # print(data_dict)
        return JsonResponse(data=data_dict, safe=False)

    return render(request, "navia_home.html", context=ctx)
예제 #21
0
파일: views.py 프로젝트: rnetonet/notes
    def get_queryset(self):
        search = self.request.GET.get("search")
        if search:
            search_vector = SearchVector("title", weight="A") + SearchVector("body", weight="B")
            search_query = SearchQuery(search)
            return Post.published.annotate(
                search_vector=search_vector,
                search_rank=SearchRank(search_vector, search_query)
            ).filter(search_vector=search_query, search_rank__gte=0.3).order_by("-search_rank")

        return Post.published.all()
예제 #22
0
    def get_search_results(self, request, queryset, search_term):
        if not search_term:
            return super().get_search_results(request, queryset, search_term)

        query = SearchQuery(search_term, search_type="websearch", config="english")
        rank = SearchRank(F('locality__search_vector'), query)
        query = Q(locality__search_vector=query)
        if ' ' not in search_term:
            query |= Q(atco_code=search_term)
        queryset = queryset.annotate(rank=rank).filter(query).order_by("-rank")
        return queryset, False
예제 #23
0
    def get_queryset(self):
        qs = Producto.objects.all()
        keywords = self.request.GET.get('barraBusqueda')
        if keywords:
            consulta = SearchQuery(keywords)
            vector = SearchVector('nombre', 'descripcion')
            qs = qs.annotate(search=vector).filter(search=consulta)
            qs = qs.annotate(
                rank=SearchRank(vector, consulta)).order_by('-rank')

        return qs
예제 #24
0
    def get_queryset(self):  # new
        query = self.request.GET.get('search_query')
        search_query = SearchQuery(query)
        search_vector = SearchVector('name', 'body', 'address')
        search_rank = SearchRank(search_vector, search_query)
        trigram_similarity = TrigramSimilarity('name', query)
        object_list = Agency.objects.annotate(search=search_vector).filter(
            search=search_query).annotate(rank=search_rank +
                                          trigram_similarity).order_by('-rank')

        return object_list
예제 #25
0
파일: views.py 프로젝트: luispillaga/blog
def search_posts(request, value):
    if request.POST:
        return redirect(reverse_lazy('posts:search_posts', args=[request.POST.get('value')]))
    else:
        search_vector = SearchVector('title', weight='A') + SearchVector('content', weight='B')
        search_query = SearchQuery(value)
        results = Post.published.annotate(
            search=search_vector,
            rank=SearchRank(search_vector, search_query)
        ).filter(search=search_query).order_by('-rank')
        return render(request, "blog/founded_posts.html", {'results': results, 'value': value})
예제 #26
0
    def get_queryset(self):
        qs = super().get_queryset()
        keywords = self.request.GET.get('q')
        if keywords:
            query = SearchQuery(keywords)
            vector = SearchVector('title', 'text')
            qs = qs.annotate(search=vector).filter(search=query)

            qs = qs.annotate(rank=SearchRank(vector, query)).order_by('-rank')
            print("qs {}".format(qs.__dict__))
        return qs
예제 #27
0
 def get_specs_search_rank(self, ct_obj: ContentType, cat_list=None):
     """Rank and filter specifications by search text"""
     query = self.query
     vector = self.get_specs_vector()
     qs_prod = self.get_products_search(ct_obj)
     product = qs_prod.filter(id=OuterRef('object_id'))
     product_rank = product.annotate(rank=SearchRank('search', query))
     qs = get_specs(ct_id=ct_obj.id).annotate(search=vector)
     if cat_list is None:
         qs = qs.filter(Q(Exists(product)) | Q(search=query))
     else:
         qs = qs.filter(category_id__in=cat_list)
     qs = qs.annotate(
         rank_prod=Subquery(product_rank.order_by().values('rank')),
         rank_spec=SearchRank('search', query),
     ).annotate(rank=Case(
         When(rank_prod__isnull=True, then='rank_spec'),
         default=(F('rank_prod') + F('rank_spec')),
     ))
     return get_specs_with_rating(qs)
예제 #28
0
파일: views.py 프로젝트: matt-l-w/quotr
    def get_queryset(self):
        quotes = Quote.objects.filter(
            created_by=self.request.user).order_by('-modified')
        if 'search' in self.request.GET and self.request.GET['search']:
            query = SearchQuery(self.request.GET['search'])
            vector = SearchVector('text', 'book__title', 'book__author')
            quotes = quotes.annotate(
                search=vector, rank=SearchRank(vector, query)).filter(
                    search=self.request.GET['search']).order_by('-rank')

        return quotes
예제 #29
0
def slow_search(request):
    query = request.GET.get('search_text')
    #vector = SearchVector('tsv')
    q = SearchQuery(query, config='english')
    #results = ArchivePage.objects.filter(tsv=query)[:10]
    #This is really really slow :(
    results = ArchivePage.objects.annotate(
        rank=SearchRank(F('tsv'), q)).order_by('-rank')[:10]
    #print(results.query)
    context = {'results': results}
    return render(request, 'archive/search.html', context)
예제 #30
0
 def _search_by_keywords_no_sort(self, keywords):
     now = datetime.now().timestamp()
     # Use expressions.Value to represent search_vector column.
     # This can avoid create the search vector for each request.
     # The search_vector has already added as a SearchVectorField and updated by the trigger, we can use it directly.
     products = self.annotate(rank=SearchRank(expressions.Value('search_vector'), keywords)) \
         .filter(active=True,
                 promotion_start_date__lte=now,
                 promotion_end_date__gt=now,
                 search_vector=keywords)
     return products
예제 #31
0
    def get_queryset(self):
        qs = Post.objects.published()

        keywords = self.request.GET.get('q')
        if keywords:
            query = SearchQuery(keywords)
            vector = SearchVector('title', 'content')
            qs = qs.annotate(search=vector).filter(search=query)
            qs = qs.annotate(rank=SearchRank(vector, query)).order_by('-rank')

        return qs