Flask中es的搜索引擎使用

一、安装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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值