一、安装docker
a.更新源:sudo apt-get update b.安装docker: sudo apt-get install docker.io
1、什么是docker
(1) Docker是使用最广泛的开源容器引擎
(2)一种操作系统基本的虚拟化技术
(3)一种简单的应用程序打包工具
(4) 依赖Linux内核特性:Namespace(资源隔离) 和 Cgroup(资源限制)
2、为什么使用docker?
(1) 高效的利用资源
(2)单台机器得部署多个应用;
(3) 应用之间互相隔离(微服务);
(4)应用之间不能发生资源抢占,每个应用只能使用事先注册申请的资源。
(5)docker设计小巧,部署迁移快速,运行高效,按照应用隔离,管理人员可以看到所有容器的内容。
二、Elasticserch使用
1、什么是es?
elasticsearch设计的理念就是分布式搜索引擎,底层实现是基于Lucene的,核心思想是在多态机器上启动多个es进程实例,组成一个es集群。
为什么使用elasticserch?
容错性好;单点故障时,可以通过复制数据到不同的服务器上达到容错的目的;
2、拉取镜像和创建容器
拉取es镜像
docker pull bitnami/elasticsearch
创建es容器
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch bitnami/elasticsearch
3、创建es实例
"""
es 引擎相关
"""
from elasticsearch import Elasticsearch
# 创建es 实例
es = Elasticsearch("http://101.42.224.35:9200/")
class ES(object):
"""
es 对象
"""
# 初始化连接一个 Elasticsearch 操作对象
def __init__(self, index_name: str):
self.es = es
self.index_name = index_name
# 根据 ID 获取文档数据
def get_doc(self, uid):
return self.es.get(index=self.index_name, id=uid)
# 插入文档数据
def insert_one(self, doc: dict):
self.es.index(index=self.index_name, body=doc)
def insert_array(self, docs: list):
for doc in docs:
self.es.index(index=self.index_name, body=doc)
# 搜索文档数据 query 字段 count 30 秒
# 三元运算符 :条件成立执行语句,if条件 ,else 条件不成立执行语句
def search(self, query, count: int = 30, fields=None):
fields = fields if fields else ["title", 'pub_date']
dsl = {
"query": {
"multi_match": {
"query": query,
"fields": fields
},
# 'wildcard': {
# 'content': {
# 'value': '*' + query + '*'
# }
# }
},
"highlight": {
"fields": {
"title": {}
}
}
}
match_data = self.es.search(index=self.index_name, body=dsl, size=count)
return match_data
def _search(self, query: dict, count: int = 20, fields=None): # count: 返回的数据大小
results = []
match_data = self.search(query, count, fields)
for hit in match_data['hits']['hits']:
results.append(hit['_source'])
return results
# 添加文档数据
def create_index(self):
if self.es.indices.exists(index=self.index_name) is True:
self.es.indices.delete(index=self.index_name)
self.es.indices.create(index=self.index_name, ignore=400)
# 删除文档数据
def delete_index(self):
try:
self.es.indices.delete(index=self.index_name)
except:
pass
4、数据库数据导入到es中
"""
将数据库数据导入es
"""
import pymysql
import traceback
from elasticsearch import Elasticsearch
def get_db_data():
# 打开数据库连接(ip/数据库用户名/登录密码/数据库名)
db = pymysql.connect(host="127.0.0.1:3306", user="root", password="123",
database="p8_lixiaolong", charset='utf8')
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
sql = "SELECT * FROM course"
# 使用 execute() 方法执行 SQL 查询
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
# 关闭数据库连接
db.close()
return results
def insert_data_to_es():
es = Elasticsearch("http://101.42.224.35:9200/")
# 清空数据
es.indices.delete(index='course')
try:
i = -1
for row in get_db_data():
print(row)
print(row[1], row[2])
i += 1
es.index(index='course', body={
'id': i,
'table_name': 'table_name',
'pid': row[4],
'title': row[5],
'desc': str(row[6]),
})
except:
error = traceback.format_exc()
print("Error: unable to fecth data", error)
if __name__ == "__main__":
insert_data_to_es()
5、模型类中加入相关索引内容
class Tag(Base):
"""
课程标签
"""
__tablename__ = 'tag'
__searchable__ = ['title'] #搜索相关字段
__analyzer__ = ChineseAnalyzer() #中文索引
id = db.Column(db.Integer, primary_key=True, doc='课程标签id')
title = db.Column(db.String(16), doc='课程类别')
sequence = db.Column(db.Integer, doc='展示顺序', default=10)
def __str__(self):
return self.title
6、在请求中使用
class GetTag(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('q')
args = parser.parse_args()
q= args.get('q')
try:
#使用es进行全文搜索
es = ES(index_name='Tag')
result = es._search(q, fields=['title', 'desc'])
return marshal(result, tag_fields)
except:
error = traceback.format_exc()
return {'message':error},500