python自动生成pg数据库表对应的es索引

项目需要用到Es进行查询。手动创建Es索引太麻烦,写了个脚本。

首先需要安装两个库

复制代码
pip install psycopg2

我使用的es版本是7.10的安装对应版本的elasticsearch库

复制代码
pip install elasticsearch==7

以下是生成索引代码

复制代码
import psycopg2  # 导入psycopg2驱动程序
from elasticsearch import Elasticsearch

# 连接到Elasticsearch
es = Elasticsearch(["http://192.168.1.2:9210"])
index_mapping = {
    'mappings': {
        'properties': {}
    }
}


def getcolumns(table):
    # 创建数据库连接
    cnx = psycopg2.connect(
        host='192.168.1.26',
        port='5432',
        database='test',
        user='postgres',
        password='******'
    )

    # 创建游标
    cursor = cnx.cursor()
    # 执行查询语句
    query = f"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '{table}'"
    cursor.execute(query)

    # 获取结果
    result = cursor.fetchall()

    # 关闭游标和连接
    cursor.close()
    return result


def get_es_type(data_type):
    if data_type == 'integer':
        return 'integer'
    elif data_type == 'bigint':
        return 'long'
    elif data_type == 'numeric':
        return 'float'
    elif data_type == 'character varying' or data_type == 'text':
        return 'text'
    elif data_type == 'boolean':
        return 'boolean'
    elif data_type == 'timestamp with time zone' or data_type == 'timestamp without time zone':
        return 'date'
    elif data_type == 'bytea':
        return 'binary'
    else:
        return 'keyword'  # 默认使用keyword类型


# 创建Es索引
def create_index(table_name, index_name):
    result = getcolumns(table_name)

    # 添加字段映射
    for column_name, data_type in result:
        es_type = get_es_type(data_type)
        index_mapping['mappings']['properties'][column_name] = {'type': es_type}
        if es_type == 'text' or es_type == 'keyword':
            index_mapping['mappings']['properties'][column_name] = {
                'type': es_type,
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
    # 使用indices.exists()方法判断Index是否存在
    if not es.indices.exists(index=index_name):
        es.indices.create(index=index_name, body=index_mapping)
        print(f'索引{index_name}创建成功。')
    else:
        print(f'索引{index_name}已存在,无需创建。')


# 需要创建索引的表
indexlist = [
    {
        'table_name': 'pg_table1',
        'index_name': 'es_index1'
    },
    {
        'table_name': 'pg_table2',
        'index_name': 'es_index2'
    },
    {
        'table_name': 'pg_table3',
        'index_name': 'es_index3'
    },
    {
        'table_name': 'pg_table4',
        'index_name': 'es_index4'
    }
]

for indexinfo in indexlist:
    table_name = indexinfo['table_name']
    index_name = indexinfo['index_name']
    create_index(table_name, index_name)
相关推荐
得物技术35 分钟前
破解gh-ost变更导致MySQL表膨胀之谜|得物技术
数据库·后端·mysql
数据智能老司机4 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
MacroZheng4 小时前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
数据智能老司机5 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机5 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
Raymond运维5 小时前
MariaDB源码编译安装(二)
运维·数据库·mariadb
沢田纲吉5 小时前
🗄️ MySQL 表操作全面指南
数据库·后端·mysql