当前位置: 首页 > 工具软件 > flask-common > 使用案例 >

flask--es的搜索引擎

有翰海
2023-12-01

es的搜索引擎主要分一下步骤

1.docker的简单了解

2.docker安装

3.Elasticsearch的简单了解

4.Elasticsearch的安装

5.Elasticsearch和python交互配置

6.Elasticsearch在python的使用


前言:

1. Docker的思想源于集装箱,集装箱解决了什么问题呢?
2. 在早期运输货物需要不同分类的船,例如运输水果的船,运输生活用品的船
3. 有了集装箱后,在大船上,可以把货物分类到不同的集装箱中,水果一个集装箱,生活用品一个集装箱
4. 它们之间互不影响,只要把货物封装好集装箱里,就可以把不同类的货物一起运走。
5. 通过Docker logo也可以看出所以然来,Docker就像大船,集装箱就是容器。
6. 一条鲸鱼拖着若干个集装箱的经典形象已经深入人心。

1.docker的简单了解

1. Docker是使用最广泛的开源容器引擎

2. 一种操作系统基本的虚拟化技术

3. 一种简单的应用程序打包工具

4. 依赖Linux内核特性:Namespace(资源隔离) 和 Cgroup(资源限制)

5.容器

  • 容器是一个操作系统级别下的虚拟化技术,运行一个容器就行运行一个进程一样

  • 容器依赖linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)

6.具体了解docker去下面网址:01: docker 基本使用 - 不做大哥好多年 - 博客园

(支持原作者的作品,有需要的自己去了解)

2.docker安装

a.更新源:sudo apt-get update  
b.安装docker: sudo apt-get install docker.io

c.查看docker:sudo docker ps

可以不用加sudo,这就是要根据自身情况来说的

如果出现以下报错,小编给的解决方案

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

解决方案:出现在这个错误 表明了你开启了两个虚拟机 就重启就好了

Command 'curl' not found, but can be installed with:

sudo snap install curl  # version 7.82.0, or
sudo apt  install curl

See 'snap info curl' for additional versions.

解决方案:sudo apt-get install curl

3.Elasticsearch的简单了解

1.作为数据库(代替MySQL);
2.在大数据条件下做检索服务、同义词处理、相关度排名、复杂数据分析、海量数据的近实时处理;
3.记录和日志的分析
4.全文检索
5.关系型数据库的补充,传统数据库的替代
6.站内搜索、垂直搜索

8.如果具体了解Elasticsearch相关用法去下面的网址:http://t.csdn.cn/7Fm6I
(支持原作者的作品,有需要的自己去了解)


4.Elasticsearch的安装

1、拉取es镜像

docker pull bitnami/elasticsearch
2、创建es容器

docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch bitnami/elasticsearch

如果出现以下报错,小编给的解决方案

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json: dial unix /var/run/docker.sock: connect: permission denied

解决方案:在命令前面加上sudo

在安装1.拉取镜像的时候可能需要的时间会长    在安装2.成功会出现一堆乱码

5.Elasticsearch和python交互配置

1.具体的解释每个代码块

2.整张页面的es相关的代码

3.将数据库数据导入es

1.具体的解释每个代码块

初始化连接一个 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

2.整张页面的es相关的代码

创建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

3.将数据库数据导入es

import pymysql
import traceback
from elasticsearch import Elasticsearch


def get_db_data():
    # 打开数据库连接(ip/数据库用户名/登录密码/数据库名)
    db = pymysql.connect(host="数据库端口", user="root", password="数据库密码",
                         database="库名", charset='utf8')
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    # sql 查询语句
    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
            # index就是对应的一张表 eg.对应的就是course表
            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__":

6.Elasticsearch在python的使用

__searchable__ = ['title'] #搜索相关的字段
__analyzer__ = ChineseAnalyzer()#支持中文索引
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)
    course = db.relationship('Course', secondary='course_tag', backref=db.backref('tags'))

    def __str__(self):
        return self.title

在python中使用的方法----es.searche()

 es = ES(index_name='Tag')
 result = es._search(q, fields=['title', 'desc'])

import traceback
from common.es.es import ES

class GetTag(Resource):
    def get(self):
       """
       获取前端数据
       使用es全文搜索
"""
        parser = reqparse.RequestParser()
        parser.add_argument('q')
        args = parser.parse_args()
        q= args.get('q')
        try:
            es = ES(index_name='Tag')
            result = es._search(q, fields=['title', 'desc'])
            return marshal(result, tag_fields)
        except:
            error = traceback.format_exc()
            print('111111111111', error)
            return {'message': error}, 500

以上所有是小编遇见的,如果进行相关的了解docker,es 文章里面都有原创的网址

谢谢小伙伴们观看

 类似资料: