1

model.pyComment intégrer Haystack avec Django Rest Framework pour faire l'API GET REST pour la recherche?

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 

Et je url.py ajouté:

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

maintenant à rendre la demande GET de postier comme:

http://127.0.0.1:8000/searchquery/?q=app, je reçois la réponse à volonté comme le montrent au dessous de.

{ 
    "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" 
    } 
    ] 
} 

Mais le temps est très lent Reponse il faut environ 2700 ms chaque fois, et je veux le faire rapidement. Comme réponse de la recherche élastique est très rapide, mais je ne sais pas ce que je fais mal. Pas sûr, mais peut être dû à ces raisons que je reçois ce retard: 1) Haystack est faite pour django, donc sur l'intégration avec le cadre de repos django, il peut être lent. 2) J'utilise gratuit herosu de recherche Bonsai Elastic ajouter sur et il a juste 125 mb de mémoire.

Voilà comment je me connecte à Bonsai recherche élastique (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} 

Toute aide sera appréciée. Je suis nouveau à la recherche élastique. Je veux faire une recherche élastique pour rechercher des produits par nom pour mon application android. Je ne sais même pas si c'est la bonne approche pour faire des recherches. J'ai pensé que j'entrerais le nom du produit que je veux rechercher et alors j'enverrai une demande de GET et obtiendra tous les produits qui sont liés.

j'ai fait Profil Python s'il vous plaît regarder ici: gist

Si quelqu'un pouvait me suggérer une autre façon d'y parvenir, j'appréciera votre aide.

+0

Avez-vous essayé de faire une requête sur élastique sans Django, combien de temps cela prend-il? –

+0

@KirillErmolov ouais sans django la requête était rapide autour de 150 ms –

Répondre

-1

La réponse de recherche est lent à cause de ce code:

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

index_queryset est censé revenir ensemble de requêtes, vous fait tous les objets retournerez modèle. Cette méthode est appelée pour chaque élément renvoyé dans la recherche.

+0

Quelqu'un peut-il expliquer pourquoi le vote vers le bas! – Ashim