服务器起es服务
第一步:拉取镜像
docker image pull delron/elasticsearch-ik:2.4.6-1.0
第二步:运行容器
docker run -d -p 9200:9200 --name search delron/elasticsearch-ik:2.4.6-1.0
windows 下安装jdk 1.8版本
elasticsearch 2.4.6版本
pip3 install elasticsearch==2.4.1
下载对应版本的ik分词器
Django 配置es
第一步:安装依赖包
pip3 install drf-haystack pip3 install elasticsearch
==2.4.1
pip3 install djangorestframework
第二步:在django项目配置文件settings.py中注册应用
INSTALLED_APPS = [
...
'app01.apps.App01Config',
'haystack',
'rest_framework'
]
第三步:在django项目配置文件settings.py中指定搜索的后端
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址和端口
'INDEX_NAME': 'course', # 指定elasticserach建立的索引库名称
},
}
# 搜索结果每页显示数量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
# 实时更新index
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
第四步:创建索引model类
在此之前要先创建model类,并插入数据
class TestData(models.Model): title = models.CharField(max_length=20) content = models.TextField() cate = models.CharField(max_length=10) class Meta: db_table = 'testdata'
在需要进行索引的应用的目录下创建文件search_indexes.py, 在该文件内创建该索引类
我在minapp应用下创建:search_indexes.py
索引模型类的名称必须是 模型类名称 + Index
from haystack import indexes
from .models import TestData
# 索引类
class BookIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
"""返回建立索引的模型类"""
return TestData
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
return self.get_model().objects.all()
第五步:在templates目录中创建text字段使用的模板文件
创建文件templates/search/indexes/APP名称/model类名称加上_text.txt文件中定义
{{ object.title }}
{{ object.content }}
第六步:手动更新索引
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')
}
]
es版本5.0以上不支持string属性,使用以下命令读取时会报错
python manage.py rebuild_index #数据库有多少条数据,全部会被同步到es中
第七步:创建saystack序列化器
from drf_haystack.serializers import HaystackSerializer
from rest_framework.serializers import ModelSerializer
from minapp import models
from minapp.search_indexes import TestData, BookIndex
class TestSerializer(ModelSerializer):
class Meta:
model = models.TestData
fields = '__all__'
class TestIndexSerializer(HaystackSerializer):
object = TestSerializer(read_only=True) # 只读,不可以进行反序列化
class Meta:
index_classes = [BookIndex] # 索引类的名称
fields = ('text', 'object') # text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
第八步:创建视图类
from drf_haystack.viewsets import HaystackViewSet
from minapp.models import TestData
from minapp.mySer import TestIndexSerializer
class BookSearchView(HaystackViewSet):
index_models = [TestData] # 数据库模型类
serializer_class = TestIndexSerializer #
saystack序列化器
第九步:添加路由
'''es '''
from rest_framework import routers
from minapp.views import BookSearchView
router = routers.DefaultRouter()
router.register("es", BookSearchView, basename="book-search")
urlpatterns = [
path('admin/', admin.site.urls),
path('hh', Index.as_view()),
# whoosh
# path('whoosh/', basic_search),
]
'''es '''
urlpatterns += router.urls