【问题标题】:How to integrate Haystack with Django Rest Framework for making GET REST API for searching?如何将 Haystack 与 Django Rest Framework 集成以制作 GET REST API 进行搜索?
【发布时间】:2025-12-10 06:25:01
【问题描述】:

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

我在 url.py 中添加了:

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

现在向邮递员发出 GET 请求,例如:

http://127.0.0.1:8000/searchquery/?q=app,我收到了如下所示的回复。

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

但是响应时间很慢,每次都需要2700毫秒左右, 我想让它快点。由于弹性搜索的响应非常快 但我不知道我做错了什么。不确定,但可能是由于 这些原因我得到了这个延迟:1)干草堆是为 django,所以将它与 django rest 框架集成,它可能是 变慢。 2)我正在使用免费的 Bonsai Elastic search heroku add on 它只有 125 mb 内存。

这就是我连接到 Bonsai 弹性搜索的方式 (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} 

任何帮助将不胜感激。我是弹性搜索的新手。我想做弹性搜索来按名称搜索我的 android 应用程序的产品。 我什至不知道这是否是进行搜索的正确方法。我想我会输入我想要搜索的产品名称,然后我会发送一个 GET 请求并获取所有相关的产品。

我做了 Python Profile 请看这里:gist

如果有人可以建议我实现此目标的任何其他方式,我将感谢您的帮助。

【问题讨论】:

  • 您是否尝试在没有 Django 的情况下对 elastic 进行查询,花了多长时间?
  • @KirillErmolov 是的,没有 django,查询速度很快,大约 150 毫秒

标签: django rest elasticsearch django-rest-framework django-haystack


【解决方案1】:

由于这段代码,搜索响应很慢:

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

index_queryset 应该返回查询集,实际上是返回所有模型对象。搜索中返回的每个项目都会调用此方法。

【讨论】:

    最近更新 更多