The best way to use full-text search in django-filters' FilterSet?












0















My app uses rest-framework and django-filter. I use this FilterSet to provide filtering list of articles (ModelViewSet) by date:



from django_filters import rest_framework as filters

class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')

class Meta:
model = Article
fields = ['pub_date']


I want to add search box to my app, so I need another filter, that will use full-text search at my Article model. Fields I would to search are title and description. I decided to add search field with method parameter like that:



from django_filters import rest_framework as filters
from django.contrib.postgres.search import SearchVector

class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
search = filters.CharFilter(method='filter_search')

def filter_search(self, queryset, name, value):
return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)

class Meta:
model = Article
fields = ['pub_date']


It works, but I'm not sure that it's the best way of using full-text search filtering. Am I missing something or this approach is ok?










share|improve this question



























    0















    My app uses rest-framework and django-filter. I use this FilterSet to provide filtering list of articles (ModelViewSet) by date:



    from django_filters import rest_framework as filters

    class ArticleFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
    end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')

    class Meta:
    model = Article
    fields = ['pub_date']


    I want to add search box to my app, so I need another filter, that will use full-text search at my Article model. Fields I would to search are title and description. I decided to add search field with method parameter like that:



    from django_filters import rest_framework as filters
    from django.contrib.postgres.search import SearchVector

    class ArticleFilter(filters.FilterSet):
    start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
    end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
    search = filters.CharFilter(method='filter_search')

    def filter_search(self, queryset, name, value):
    return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)

    class Meta:
    model = Article
    fields = ['pub_date']


    It works, but I'm not sure that it's the best way of using full-text search filtering. Am I missing something or this approach is ok?










    share|improve this question

























      0












      0








      0








      My app uses rest-framework and django-filter. I use this FilterSet to provide filtering list of articles (ModelViewSet) by date:



      from django_filters import rest_framework as filters

      class ArticleFilter(filters.FilterSet):
      start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
      end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')

      class Meta:
      model = Article
      fields = ['pub_date']


      I want to add search box to my app, so I need another filter, that will use full-text search at my Article model. Fields I would to search are title and description. I decided to add search field with method parameter like that:



      from django_filters import rest_framework as filters
      from django.contrib.postgres.search import SearchVector

      class ArticleFilter(filters.FilterSet):
      start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
      end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
      search = filters.CharFilter(method='filter_search')

      def filter_search(self, queryset, name, value):
      return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)

      class Meta:
      model = Article
      fields = ['pub_date']


      It works, but I'm not sure that it's the best way of using full-text search filtering. Am I missing something or this approach is ok?










      share|improve this question














      My app uses rest-framework and django-filter. I use this FilterSet to provide filtering list of articles (ModelViewSet) by date:



      from django_filters import rest_framework as filters

      class ArticleFilter(filters.FilterSet):
      start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
      end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')

      class Meta:
      model = Article
      fields = ['pub_date']


      I want to add search box to my app, so I need another filter, that will use full-text search at my Article model. Fields I would to search are title and description. I decided to add search field with method parameter like that:



      from django_filters import rest_framework as filters
      from django.contrib.postgres.search import SearchVector

      class ArticleFilter(filters.FilterSet):
      start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
      end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
      search = filters.CharFilter(method='filter_search')

      def filter_search(self, queryset, name, value):
      return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)

      class Meta:
      model = Article
      fields = ['pub_date']


      It works, but I'm not sure that it's the best way of using full-text search filtering. Am I missing something or this approach is ok?







      django django-rest-framework django-filters






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 25 '18 at 11:38









      vadimbvadimb

      387




      387
























          1 Answer
          1






          active

          oldest

          votes


















          1














          This is ok for a naive text search where you don't have much text to look into in a small-ish database.



          When you get into bigger areas you need to either optimize your db for this or move to a dedicated search engine like Solr or ElasticSearch. Postgres has a section on full text searching, as does mysql.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467051%2fthe-best-way-to-use-full-text-search-in-django-filters-filterset%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            This is ok for a naive text search where you don't have much text to look into in a small-ish database.



            When you get into bigger areas you need to either optimize your db for this or move to a dedicated search engine like Solr or ElasticSearch. Postgres has a section on full text searching, as does mysql.






            share|improve this answer




























              1














              This is ok for a naive text search where you don't have much text to look into in a small-ish database.



              When you get into bigger areas you need to either optimize your db for this or move to a dedicated search engine like Solr or ElasticSearch. Postgres has a section on full text searching, as does mysql.






              share|improve this answer


























                1












                1








                1







                This is ok for a naive text search where you don't have much text to look into in a small-ish database.



                When you get into bigger areas you need to either optimize your db for this or move to a dedicated search engine like Solr or ElasticSearch. Postgres has a section on full text searching, as does mysql.






                share|improve this answer













                This is ok for a naive text search where you don't have much text to look into in a small-ish database.



                When you get into bigger areas you need to either optimize your db for this or move to a dedicated search engine like Solr or ElasticSearch. Postgres has a section on full text searching, as does mysql.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 25 '18 at 12:52









                JasonJason

                6,2851770149




                6,2851770149
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53467051%2fthe-best-way-to-use-full-text-search-in-django-filters-filterset%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    404 Error Contact Form 7 ajax form submitting

                    How to know if a Active Directory user can login interactively

                    TypeError: fit_transform() missing 1 required positional argument: 'X'