如何将 Haystack 与 Django Rest Framework 集成,以制作用于搜索的 GET REST AP



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": "applendjflkj",
"id": 14,
"name": "apple",
"mrp": "45.000000",
"company": "djflkj",
"imageid": "jfhi",
"edible": false,
"discount": "0.000000",
"deliverable": true,
"seller_uid": "ljhkh",
"category": "ldjhgjfdk"
},
{
"text": "appnhuhiu",
"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)我正在使用免费的盆景弹性搜索heroku附加组件 它只有125 MB的内存。

这就是我连接到盆景弹性搜索 (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} 

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

我做了Python配置文件,请在这里看:要点

如果有人能建议我任何其他实现这一目标的方法,我将不胜感激。

由于以下代码,搜索响应很慢:

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

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

最新更新