使用 Elasticsearch 查询和数据同步的实现方法

在开发过程中,将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch,并基于多字段的唯一性来判断是否执行插入或更新操作。此外,我们还将深入探讨如何构造复杂的查询条件,例如针对字段的多值匹配。

数据唯一性字段说明

在本示例中,我们使用 A, B, C, 和 D 四个字段来判断数据是否唯一。通过这四个字段生成唯一标识符,在 Elasticsearch 中确保数据的唯一性。下面是完整的实现过程。


脚本实现

1. 数据库查询与数据转换

首先,从数据库中查询所需的数据并将其转换为 Python 字典形式,便于后续插入到 Elasticsearch。

复制代码
import psycopg2

# 数据库配置
DB_CONFIG = {
    'host': 'localhost',
    'port': 5432,
    'dbname': 'your_database',
    'user': 'your_username',
    'password': 'your_password'
}

def fetch_data_from_db():
    query = """
    SELECT A, B, C, D, updated_at, other_columns
    FROM your_table
    WHERE updated_at > NOW() - INTERVAL '1 day';
    """
    try:
        connection = psycopg2.connect(**DB_CONFIG)
        cursor = connection.cursor()
        cursor.execute(query)
        rows = cursor.fetchall()
        columns = [desc[0] for desc in cursor.description]
        return [dict(zip(columns, row)) for row in rows]
    except Exception as e:
        print(f"Error fetching data from database: {e}")
    finally:
        if cursor:
            cursor.close()
        if connection:
            connection.close()

2. 生成唯一标识符

通过字段 A, B, C, D 拼接生成唯一的文档标识符:

复制代码
def generate_document_id(record):
    unique_id = f"{record['A']}_{record['B']}_{record['C']}_{record['D']}"
    return unique_id

3. 插入或更新数据到 Elasticsearch

利用 elasticsearch 库中的 helpers.bulk 方法批量处理数据。

复制代码
from elasticsearch import Elasticsearch, helpers

ES_CONFIG = {
    'hosts': ['http://localhost:9200'],
    'index': 'your_index'
}

def upsert_to_elasticsearch(data):
    try:
        es = Elasticsearch(ES_CONFIG['hosts'])
        actions = []
        for record in data:
            doc_id = generate_document_id(record)
            action = {
                "_index": ES_CONFIG['index'],
                "_id": doc_id,
                "_source": record
            }
            actions.append(action)

        helpers.bulk(es, actions)
        print(f"Successfully inserted/updated {len(data)} records in Elasticsearch.")
    except Exception as e:
        print(f"Error upserting data to Elasticsearch: {e}")

if __name__ == "__main__":
    print("Fetching data from database...")
    data = fetch_data_from_db()
    if data:
        print(f"Fetched {len(data)} records. Upserting to Elasticsearch...")
        upsert_to_elasticsearch(data)
    else:
        print("No data fetched from the database.")

查询构造与条件扩展

在实际开发中,构造复杂的查询条件是常见需求。例如,我们需要针对字段 meta_flag 匹配多个值,并对查询结果按 order_time 排序。

示例查询

复制代码
query_body = {
    "query": {
        "bool": {
            "must": [
                {
                    "terms": {
                        "A": ["sale", "other"]
                    }
                },
                {
                    "term": {
                        "B": 'B'
                    }
                }
            ]
        },
    },
    "sort": [
        {
            "create_time": {
                "order": "desc"  # "asc" 表示升序, "desc" 表示降序
            }
        }
    ]
}

查询关键点

  1. 多值匹配:
  • 使用 terms 查询来匹配 meta_flag 的多个值,例如 sale_out 和 other_out。
  1. 精确匹配:
  • 使用 term 查询匹配 sn 的特定值。
  1. 结果排序:
  • 根据 order_time 字段降序排列,确保最新数据优先。
  1. 动态条件:
  • 查询条件可以通过变量动态生成,例如:

    A_flags = ["sale", "other"]
    query_body['query']['bool']['must'][0]['terms']['A'] = A_flags


扩展与优化

1. 数据结构映射

在 Elasticsearch 中,可以通过字段映射确保数据一致性:

复制代码
PUT /your_index
{
  "mappings": {
    "properties": {json
      "A": { "type": "keyword" },
      "B": { "type": "keyword" },
      "C": { "type": "keyword" },
      "D": { "type": "keyword" },
      "updated_at": { "type": "date" }
    }
  }
}

2. 删除支持

若需同步删除,可通过 Elasticsearch 的 delete API 实现。

3. 性能优化

调整批量操作的大小(chunk_size)或使用分页查询分段同步大数据量。


总结

本文介绍了如何实现从数据库同步数据到 Elasticsearch 的完整流程,重点展示了基于字段 A, B, C, 和 D 的唯一性判断,以及如何构造复杂查询条件。通过以上方法,开发者可以高效地将结构化数据同步到 Elasticsearch 并支持多种查询需求。

相关推荐
wafrdggh11 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿12 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
大大大大晴天14 小时前
OLTP、OLAP、数据湖、数据集市、湖仓一体到底是什么关系?
大数据
正在走向自律17 小时前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
freejackman18 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
goujunwe18 小时前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能
小田学Python19 小时前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
成都蜀味缘餐饮技术培训学校1 天前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
roman_日积跬步-终至千里1 天前
AI 能让一个人成为团队吗?从数据中台到 OPC,重新理解软件工程能力
大数据·人工智能·软件工程
演艺大赏1 天前
NiFi 数据流实战:FTP→HDFS 与 CSV→Parquet,附坏数据、漏文件与双写
大数据