1.容器创建配置
sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
sudo docker run -dit --network=host --name=elasticsearch -p 9200:9200 delron/elasticsearch-ik:2.4.6-1.0 -Des.network.publish_host="公网IP"
2.打开防火墙端口
打开防火墙9200端口
并访问公网IP:9200端口,如果正常,返回以下结果
3.django处理
haystack作为容器与数据之间的桥梁
下载haystack
$ pip install django-haystack
$ pip install elasticsearch==2.4.1
setting配置
INSTALLED_APPS = [
...
'haystack',
...
]
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://公网IP:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'matron_search', # Elasticsearch建立的索引库的名称, 可以任意起
},
}
# elasticsearch每页数量 可设置
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
创建search_indexes.py文件
在要查询的表对应的子项目底下创建search_indexes.py,以MatronInfo为例
from haystack import indexes
from .models import *
class MatronIndex(indexes.SearchIndex, indexes.Indexable):
"""索引数据模型类"""
text = indexes.CharField(document=True, use_template=True) # 必须要添加的document参数,后面是查询是否需要模板
name = indexes.CharField(model_attr="name")
serve_type = indexes.CharField(model_attr="serve_type")
image_default = indexes.CharField(model_attr="image_default")
department = indexes.CharField(model_attr="department")
id = indexes.CharField(model_attr="pk")
autocomplete = indexes.EdgeNgramField()
def get_model(self):
"""返回建立索引的模型类"""
return MatronsInfo # 要查询的表对应的模型
def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
# return self.get_model().objects.filter(serve_type=True)
return self.get_model().objects.all() # 返回的查询集,可用上面的条件查询结果
创建查询实例
在如下图创建,不能缺少任何一层目录,txt文件命名格式是 需要查询的模型小写_text.txt
文件内容如下面格式,对应的属性是用来查询的字段
{{ object.name }}
{{ object.id }}
{{ object.price }}
手动生成索引
在manage.py同级目录运行下面命令
$ python manage.py rebuild_index
选择Y,出现一下结果说明成功
添加路由
在对应的子项目路由文件中添加,这里不同于其他的视图,不需要as_view()
urlpatterns = [
path('api/', MySearchView()),
]
视图编写
from haystack.views import SearchView
from django.http import JsonResponse
class MySearchView(SearchView):
'''重写SearchView类'''
def create_response(self):
"""获取搜索结果"""
context = self.get_context() # 默认的获取返回结果的方法
for MatronsInfo in context['page'].object_list:
# 构造需要返回的结果
print(MatronsInfo.object.id)
count = context['page'].paginator.count
# 拼接参数, 返回
return_dict = {'code': 0,...}
return JsonResponse(return_dict, safe=False)