How to integrate Haystack with Django Rest Framework for making GET REST API for searching?

model.py

class Item(models.Model):
        name=models.CharField(max_length=50)
        company=models.CharField(max_length=100)

search_indexes.py

class ItemIndex(indexes.SearchIndex, indexes.Indexable):
            text = indexes.CharField(document=True, use_template=True)
            name=indexes.CharField(model_attr='name')
            company=indexes.CharField(model_attr='company')

            def get_model(self):
                return Item

            def index_queryset(self, using=None):
                return self.get_model().objects.all()

serializer.py

class ItemSearchSerializer(serializers.Serializer):
    text = serializers.CharField()
    name=serializers.CharField()
    company=serializers.CharField()

views.py

 class ItemSearchViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    serializer_class = ItemSearchSerializer  
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 

    def get_queryset(self):
        request = self.request
        queryset = EmptySearchQuerySet()

        if request.GET.get('q', ''):
            query = request.GET.get('q', '')
            queryset =SearchQuerySet().filter(content=query);
        return queryset

And in url.py I added :

router.register(r'searchquery', views.ItemSearchViewSet, base_name='searchquery')

Now on making GET request from postman like :

http://127.0.0.1:8000/searchquery/?q=app, I am getting the response as desired as show below.

{
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "text": "apple\ndjflkj",
      "id": 14,
      "name": "apple",
      "mrp": "45.000000",
      "company": "djflkj",
      "imageid": "jfhi",
      "edible": false,
      "discount": "0.000000",
      "deliverable": true,
      "seller_uid": "ljhkh",
      "category": "ldjhgjfdk"
    },
    {
      "text": "app\nhuhiu",
      "id": 16,
      "name": "app",
      "mrp": "78.000000",
      "company": "huhiu",
      "imageid": "iyiugiy",
      "edible": false,
      "discount": "45.000000",
      "deliverable": true,
      "seller_uid": "hjh",
      "category": "hhl"
    }
  ]
}

But the reponse time is very slow it takes around 2700 ms everytime , and I want to make it fast. As response of elastic search is much fast but I don't know what I am doing wrong. Not sure but may be due to these reasons I am getting this delay : 1) Haystack is made for django, so on integrating it with django rest framework , it may be getting slow. 2) I am using free Bonsai Elastic search heroku add on and it has just 125 mb memory.

This is how I am connecting to Bonsai elastic search (setting.py)

ES_URL = urlparse('https://******@pine-1455731.us-east1.bonsaisearch.net')
print ES_URL
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': ES_URL.scheme + '://' + ES_URL.hostname + ':443',
        'INDEX_NAME': 'haystack',
    },
}

if ES_URL.username:
    HAYSTACK_CONNECTIONS['default']['KWARGS'] = {"http_auth": ES_URL.username + ':' + ES_URL.password} 

Any help will be appreciated. I am new to elastic search. I want to do elastic search to search products by name for my android application. I even don't know whether this is the correct approach to do searching. I thought I would enter name of product I want to search and then i will send a GET request and get all the products which are related.

I did Python Profile please look it here: gist

If any one could suggest me any other way of achieving this I will appreciate your help.

Upvotes: 1

Views: 710

Answers (1)

Ashim
Ashim

Reputation: 33

The search response is slow because of this code:

def index_queryset(self, using=None):
    return self.get_model().objects.all()

index_queryset is supposed to return query set, you are actually returning all model objects. This method is called for every item which is returned in search.

Upvotes: -1

Related Questions