django安装再次不介绍了
Elasticsearch参考该博主
先装docker,再一键安装docker pull elasticsearch:2.4.4
在此记录几个docker命令 docker pull 拉项目
- docker pull 拉项目
- docker run -d -p 9200:9200 -p 9300:9300 --name search elasticsearch:2.4.4 (运行Elasticsearch)
- docker ps查看进程
- docker images查看镜像
- curl 127.0.0.1:9200最后测试Elasticsearch有没有安装成功
如果运行成功会出现类似如下界面:
{
"name" : "David Cannon",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "wAssfOTuT-6UzYW4HQ0GqQ",
"version" : {
"number" : "2.4.6",
"build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
"build_timestamp" : "2017-07-18T12:17:44Z",
"build_snapshot" : false,
"lucene_version" : "5.5.4"
},
"tagline" : "You Know, for Search"
安装drf-haystack直接pip安装
在此遇到安装不上,直接拷贝服务器的成功运行
项目配置
ELASTICSEARCH_DSL = {
'default': {
'hosts': '127.0.0.1:9200'
},
}
# haystack搜索扩展
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'comic', # Elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
构建索引
1、编写索引类
from comic.apps.models import Comic
class ComicIndex(indexes.SearchIndex, indexes.Indexable):
"""书籍索引数据模型类"""
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
"""返回建立索引的模型类"""
return Comic
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
return self.get_model().objects.all()
在这注意ComicIndex为模型名字加上Index,并且该类写在search_indexes.py文件,并且放在和模型文件同一个目录下
2、构造具体索引值
在template\search\indexes\app_name\model_name_text.txt下构造索引值,这个路径是固定的。如果不按照这个路径的话,就在text字段内使用template_name 参数,指定模板文件。
{{ object.title }}
{{ object.digest }}
{{ object.content }}
重写了搜索视图返回json数据
class MySearchView(SearchView):
‘’‘重写SearchView类’’’
# 设置搜索模板文件
def create_response(self):
page = self.request.GET.get('page')
# 获取搜索结果
context = self.get_context()
# 拼接参数, 返回
data_list = {
"code": 200,
"msg": "success",
"count": 1,
"next": None,
"previous": None,
}
data = []
for book in context['page'].object_list:
data.append({
'id': book.object.id,
'name': book.object.name,
'author': book.object.author,
'total_views': book.object.total_point,
'author_note': book.object.author_desc,
'cover': book.object.cover,
'searchkey': context.get('query'),
# 'page_size': context['page'].paginator.num_pages,
# 'count': context['page'].paginator.count
})
data_list['data'] = data
return http.JsonResponse(data=data_list, safe=False)
最后
python manage.py rebuild_index重新建立索引
几个坑
- 版本问题djagno 和Haystack版本不一样报
AttributeError: type object 'BaseCommand' has no attribute 'option_list'
卸掉Haystack重装一遍就好了
- render改掉之前版本django的render_to_response
ImportError: cannot import name 'render_to_response'