项目需要用到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)