赞
踩
目录
第二步:在django项目配置文件settings.py中注册应用
第三步:在django项目配置文件settings.py中指定搜索的后端
第五步:在templates目录中创建text字段使用的模板文件
说到搜索,第一时间想到的是mysql数据库的like语句。但是,假如你的数据库有几千万条数据,name字段没有索引,可能查询需要十几分钟,用户可能会等你?那为什么不给name字段增加索引?数据表不仅仅是用来查询,也会经常修改数据,新增删除数据等。建立索引后,做增删改操作时也会大大占用数据库资源。所以应该怎么解决呢?Elasticsearch!
- pip install drf-haystack
- pip install elasticsearch
- pip install djangorestframework
- INSTALLED_APPS =
- [
- 'haystack',
- 'rest_framework'
- ]
- HAYSTACK_CONNECTIONS = {
- 'default':{
- 'ENGINE':'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
- 'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
- 'INDEX_NAME': 'test', # 指定elasticsearch建立的索引库的名称
- },
- }
- # 当添加、修改、删除数据时,自动生成索引
- HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
- # 指定搜索结果每页的条数
- # HAYSTACK_SEARCH_RESULTS_PER_PAGE = 1
在此之前要先创建model类,并插入数据
- from django.db import models
- class Es(models.Model):
- name=models.CharField(max_length=32)
- desc=models.CharField(max_length=32)
在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类
我在app应用下创建:search_indexes.py(文件名固定不变)
- # 索引模型类的名称必须是 模型类名称 + Index
- from haystack import indexes
- from .models import Es
- class EsIndex(indexes.SearchIndex, indexes.Indexable):
- text = indexes.CharField(document=True, use_template=True)
- def get_model(self):
- """返回建立索引的模型类"""
- return Es
- def index_queryset(self, using=None):
- """返回要建立索引的数据查询集"""
- return self.get_model().objects.all()
创建文件templates/search/indexes/app/es_text.txt文件中定义
{{ object.name }}
{{ object.desc }}
python manage.py rebuild_index #数据库有多少条数据,全部会被同步到es中
- from drf_haystack.serializers
- import HaystackSerializer
- from rest_framework.serializers
- import ModelSerializer from app
- import models
- from app.search_indexes import EsIndex
- class EsSerializer(ModelSerializer):
- class Meta:
- model=models.Es
- fields='__all__'
- class EsIndexSerializer(HaystackSerializer):
- object = EsSerializer(read_only=True) # 只读,不可以进行反序列化
- class Meta:
- index_classes = [EsIndex] # 索引类的名称
- fields = ('text', 'object') # text由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
- from drf_haystack.viewsets
- import HaystackViewSet
- from app.models import Book
- from app.serializers import EsIndexSerializer
- class EsSearchView(HaystackViewSet):
- index_models = [Es]
- serializer_class = EsIndexSerializer
- from django.conf.urls
- import url from django.contrib
- import admin
- from rest_framework import routers
- from app.views import EsSearchView
- router = routers.DefaultRouter()
- router.register("book/search", EsSearchView, base_name="book-search")
- urlpatterns = [ url(r'^admin/', admin.site.urls), ]
- urlpatterns += router.urls
http://127.0.0.1:8000/?text=测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。