使用 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_outother_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 并支持多种查询需求。

相关推荐
惜分飞7 分钟前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
子榆.27 分钟前
CANN 性能分析与调优实战:使用 msprof 定位瓶颈,榨干硬件每一分算力
大数据·网络·人工智能
新芒39 分钟前
暖通行业两位数下滑,未来靠什么赢?
大数据·人工智能
忆~遂愿1 小时前
CANN ATVOSS 算子库深度解析:基于 Ascend C 模板的 Vector 算子子程序化建模与融合优化机制
大数据·人工智能
chian-ocean1 小时前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer
艾莉丝努力练剑2 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
倒流时光三十年3 小时前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
lili-felicity3 小时前
CANN异步推理实战:从Stream管理到流水线优化
大数据·人工智能
2501_933670794 小时前
2026 高职大数据专业考什么证书对就业有帮助?
大数据
xiaobaibai1534 小时前
营销自动化终极形态:AdAgent 自主闭环工作流全解析
大数据·人工智能·自动化