当前位置: 首页 > article >正文

Elasticsearch 正排索引

一、正排索引基础概念

在 Elasticsearch 中,正排索引用于存储完整的文档内容,以便通过文档ID 快速定位文档的字段值。正排索引通过 Doc Values 和 Store Fields 两种形式,为聚合、排序、脚本计算等场景提供高效支持。Doc Values 的列式存储设计显著优化了分析性能,而 Store Fields 提供了灵活的直接字段访问能力。

与倒排索引的对比:

  • 倒排索引:词项 → 文档列表(用于搜索)。
  • 正排索引:文档ID → 字段内容(用于聚合、排序、返回原始数据)。

二、正排索引基本结构

Elasticsearch 中的正排索引(正向索引)主要通过两种机制实现:Doc Values 和 Stored Fields。以下面两个文档为例:

  • 文档内容
    • 文档id为 1:
      {"title": "Elasticsearch Guide","author": "John Doe","year": 2023,"tags": ["search", "database"]
      }
      
    • 文档id为 2:
      {"title": "Introduction to Elasticsearch","author": "Jane Smith","year": 2022,"tags": ["tutorial", "search"]
      }
      
  1. Doc Values 结构(列式存储)
    Doc Values 是 Elasticsearch 默认的正排索引实现方式,采用列式存储结构。

    • 设计目标:支持高效的列式存储(Column-oriented),用于聚合(Aggregations)、排序(Sorting)、脚本计算等。

    • 核心特点:

      • 列式存储:按字段垂直存储,而非按文档水平存储。
      • 默认启用:所有不支持text类型的字段默认开启。
      • 磁盘存储:存储在磁盘,但会被OS缓存到文件系统缓存。
    • 适用场景:

      • 数值、日期、关键字(Keyword)等非文本字段。
      • 默认启用(可通过 mapping 的 doc_values: false 关闭)。
    • 存储结构:

      • 每个字段单独存储为一列,所有文档的该字段值按DocID顺序排列。
      • 列式存储优势:
        • 高效聚合:列式存储适合聚合计算。
        • 内存友好:可以只加载需要的列。
        • 压缩存储:使用多种压缩技术减少空间占用。
        • 缓存友好:CPU缓存命中率高。
      文档 ID(DocID)字段名
      1value1
      2value2

      以year字段为例,Doc Values 结构如下:

      文档 ID(DocID)year
      12023
      22022
  2. Stored Fields 结构(行式存储)
    Stored Fields 存储原始文档的完整字段值,用于_source和显式标记为store的字段。

    • 设计目标:存储字段的原始值(如文本内容),用于直接返回特定字段(而非整个 _source)。

    • 核心特点:

      • 行式存储:按文档存储完整数据。
      • 按需启用:需要通过"store": true显式配置。
      • 原始格式:保留字段原始值。
    • 适用场景:

      • 需要频繁返回少量字段(避免解析整个 _source)。
      • 默认不启用(需在 mapping 中显式设置 “store”: true)。
    • 存储结构:

      • 按字段存储原始值,类似传统数据库的行存储。
      • 通过 stored_fields 参数指定需要返回的字段。
      文档 ID(DocID)字段名字段值
      1title“Elasticsearch Guide”
      1author“John Doe”
      1year2023
      1tags[“search”, “database”]
      2title“Introduction to Elasticsearch”
      2author“Jane Smith”
      2year2022
      2tags[“tutorial”, “search”]
  3. 正排索引的 JSON 表示

    {"documents": [{"doc_id": 1,"fields": {"title": "Elasticsearch Guide","author": "John Doe","year": 2023,"tags": ["search", "database"]}},{"doc_id": 2,"fields": {"title": "Introduction to Elasticsearch","author": "Jane Smith","year": 2022,"tags": ["tutorial", "search"]}}],"doc_values": {"year": [{"doc_id": 1, "value": 2023},{"doc_id": 2, "value": 2022}],"tags": [{"doc_id": 1, "value": "search"},{"doc_id": 1, "value": "database"},{"doc_id": 2, "value": "tutorial"},{"doc_id": 2, "value": "search"}]}
    }
    

三、正排索引的构建过程

Elasticsearch 的正排索引主要通过 Doc Values 和 Stored Fields 两种机制实现,它们的构建过程有所不同。以下是完整的构建流程:

  1. Doc Values 构建过程

    • 阶段一:内存缓冲
      1. 文档解析:
        • 根据字段映射定义解析文档各字段值。
        • 对非text类型字段自动准备构建Doc Values。
      2. 内存缓冲区:
        // 伪数据结构示例
        Map<FieldName, List<DocValueEntry>> buffer = {"price": [(doc1, 100), (doc2, 200), ...],"city": [(doc1, "北京"), (doc2, "上海"), ...]
        }
        
    • 阶段二:列式存储转换
      1. 字典编码:
        • 对字符串等离散值创建唯一值字典。
          // city字段示例
          Dictionary: ["北京", "上海", "广州"]
          
      2. 值映射:
        • 将原始值替换为字典序数。
          // 原始值 → 编码值
          "北京"0
          "上海"1
          "北京"0
          "广州"2
          
      3. 列式存储:
        • 按字段组织数据,与文档分离。
          price列: [100, 200, 150, ...]
          city列: [0, 1, 0, 2, ...]  // 使用字典编码后的值
          
    • 阶段三:磁盘持久化
      1. 文件生成:
        • 生成.dvd(数据值)和.dvm(元数据)文件。
        • 使用紧凑的二进制格式。
      2. 压缩处理:
        • 数值类型:增量编码 + 位压缩
        • 字符串类型:前缀压缩
      3. 索引构建:
        • 创建字段值到文档的快速访问索引。
        • 对排序字段构建B-tree类结构加速范围查询。
  2. Stored Fields 构建过程

    • 阶段一:原始文档处理
      1. 字段筛选:
        • 包含_source字段
        • 包含显式设置"store": true的字段
      2. 内存缓冲:
        // 伪数据结构示例
        List<StoredDocument> buffer = [{doc1, {"title": "ES指南", "content": "..."}},{doc2, {"title": "大数据", "content": "..."}}
        ]
        
    • 阶段二:文档块组织
      1. 分块处理:
        • 将多个文档打包为一个块(通常4-32KB)
        • 块内文档连续存储
      2. 压缩处理:
        • 使用LZ4算法压缩每个块
        • 字段级压缩优化
    • 阶段三:磁盘存储
      1. 文件生成:
        • 生成.fdt(字段数据)和.fdm(字段元数据)文件
        • 存储文档原始JSON结构
      2. 指针构建:
        • 创建文档ID到磁盘位置的映射表
          // 伪数据结构
          Map<DocID, (fileOffset, compressedSize)> = {1(0x1000, 1024),2(0x1400, 768)
          }
          
  3. 构建过程关键优化

    • 内存控制
      1. 缓冲限制:
        • 默认使用JVM堆外内存
        • 通过indices.memory.index_buffer_size配置(默认10%)
      2. 分段策略:
        • 内存缓冲满后生成新的段(segment)
        • 每个段包含独立的Doc Values
    • 并行构建
      1. 多线程处理:
        • 不同字段的Doc Values并行构建
        • 大型字段使用单独线程
      2. 异步持久化:
        • 内存数据异步刷盘
        • 通过refresh_interval控制(默认1秒)
  4. 构建过程示例
    假设索引以下文档:

    [{"id":1, "title":"ES基础", "price":100, "city":"北京"},{"id":2, "title":"高级教程", "price":200, "city":"上海"}
    ]
    
    • Doc Values构建结果:
      price字段:- 列数据: [100, 200]- 字典: 无(数值类型直接存储)city字段:- 字典: ["北京", "上海"]- 列数据: [0, 1] (字典序数)
      
    • Stored Fields构建结果:
      Segment文件:- 文档1原始JSON + 文档2原始JSON- 压缩存储为连续数据块
      

四、正排索引的优势

正排索引作为Elasticsearch的关键组成部分,在特定场景下展现出显著优势,与倒排索引形成互补。以下是其主要优势的详细分析:

  1. 列式存储带来的性能优势
    • 高效聚合计算
      • 相同字段的值连续存储,减少磁盘I/O
      • 直接对整列数据进行统计运算(如sum/avg/max/min)
      • 示例:计算1亿条销售记录的总金额,只需顺序读取price列
    • 更好的压缩率
      • 同列数据相似度高,压缩率可达60-70%
      • 支持多种压缩算法:LZ4、DEFLATE等
      • 显著减少磁盘占用和内存压力
    • CPU缓存友好
      • 现代CPU的缓存预取机制能更好预测列式数据访问模式
      • 相比行式存储,缓存命中率提升3-5倍
  2. 特定操作性能优势
    • 排序(Sorting)效率极高
      • 直接访问有序存储的列数据
      • 避免倒排索引需要"收集-排序"的两阶段操作
      • 测试显示比基于fielddata的排序快2-3倍
    • 聚合(Aggregation)加速
      • terms聚合直接扫描列值
      • 基数聚合(cardinality)使用列式统计
      • 比传统数据库的GROUP BY快10-100倍
    • 脚本访问优化
      • 脚本中访问doc values比_source解析快5-10倍
      • 示例:doc['price'].value * params.tax_rate
  3. 内存与资源管理优势
    • 堆外内存管理
      • 默认使用文件系统缓存而非JVM堆内存
      • 避免GC压力,稳定性提升
      • 可通过indices.queries.cache.size控制内存使用
    • 按需加载机制
      • 仅加载查询涉及的列
      • 支持内存映射(mmap)访问方式
      • 对比fielddata的全量加载更节省资源
    • 冷数据处理能力
      • 数据持久化在磁盘,适合不频繁访问的历史数据
      • 仍能保持较好性能(约为内存性能的60-70%)
  4. 特殊场景优化
    • 高基数字段处理
      • 全局序数(Global Ordinals)优化
        {"mappings": {"properties": {"user_id": {"type": "keyword","eager_global_ordinals": true}}}
        }
        
    • 地理空间数据
      • 地理距离聚合依赖doc values
      • 比传统GIS数据库快3-5倍
    • 二进制数据
      • 支持binary类型的快速读取
      • 适合存储加密数据或序列化对象

五、正排索引的局限性

尽管正排索引(Doc Values)在Elasticsearch中提供了诸多优势,但在实际应用中仍存在一些重要的局限性。

1. 存储开销限制
  1. 冗余存储
    • Doc Values 的默认启用:ES 默认对所有非文本字段(如 keyword、numeric、date)启用 Doc Values,即使某些字段不参与聚合或排序,仍会占用额外存储空间。
    • Store Fields 与 _source 的重复:若字段同时开启 store: true,则同一份数据会存储在 _source 和 Store Fields 中,导致存储冗余。
    • 示例:
      一个 keyword 字段默认生成以下存储结构:
      • 倒排索引(用于搜索)
      • Doc Values(用于聚合)
      • _source(原始值)
      • 若再设置 store: true,则额外存储一份原始值。
    • 优化建议:
      • 禁用不必要的 Doc Values:对无需聚合的字段设置 doc_values: false。
      • 避免滥用 store: true:优先通过 _source 获取字段,仅在需要快速访问时启用。
  2. 高基数字段的存储膨胀
    • 字典编码的局限性:对于高基数字段(如唯一 ID、哈希值),字典编码的压缩效率大幅下降,导致存储空间显著增加。
    • 示例:
      一个存储用户唯一 ID 的字段,若存在 1 亿个唯一值:
      • 字典编码需要维护 1 亿条映射关系。
      • 存储空间可能超过原始值的 2 倍。
    • 优化建议:
      • 对高基数字段禁用 Doc Values,改用倒排索引或其他存储方式。
      • 使用 eager_global_ordinals 优化聚合性能(预加载字典映射)。
2. 内存与性能的局限性
  1. 内存压力

    • 文件系统缓存依赖:Doc Values 依赖操作系统的 Page Cache 加载数据,若物理内存不足,频繁的磁盘 IO 会严重降低聚合性能。
    • 全局序号(Global Ordinals)的构建开销:高基数字段在聚合时需构建全局序号映射,首次查询延迟较高。
    • 示例:
      对包含 1 千万唯一值的 product_id 字段执行 terms 聚合:
      • 首次查询需构建全局序号,耗时可能达数百毫秒。
      • 后续查询复用缓存,但内存占用较高。
    • 优化建议:
      • 增加物理内存,确保文件系统缓存充足。
      • 对高频聚合的高基数字段启用 eager_global_ordinals,在段合并时预构建全局序号。
  2. 写入性能损耗

    • 正排索引的构建成本:写入文档时,ES 需同步构建倒排索引和正排索引(Doc Values/Store Fields),增加 CPU 和 IO 开销。
    • 实时性与吞吐量的权衡:高频写入场景下,正排索引的构建可能成为瓶颈,限制写入吞吐量。
    • 优化建议:
      • 对写入性能敏感的场景(如日志采集),关闭非必要字段的 Doc Values。
      • 使用更快的存储介质(如 SSD)提升 IOPS。
3. 功能支持的局限性
  1. 不支持文本字段的 Doc Values
    • 文本类型(text)的限制:text 字段默认不支持 Doc Values,因其内容经过分词处理,无法直接用于聚合或排序。
    • 优化建议:
      • 对需要聚合的文本字段,使用 keyword 类型子字段(Multi-fields):
        PUT my_index
        {"mappings": {"properties": {"message": {"type": "text","fields": {"keyword": { "type": "keyword"  // 支持聚合}}}}}
        }
        
  2. 不支持动态更新
    • 段不可变性:正排索引(Doc Values)随 Lucene 段(Segment)的生成而固化,更新文档需重新构建整个段,无法原地修改。
    • 近实时性限制:新写入的数据需通过 refresh 操作生成新段后,其正排索引才可见,默认延迟 1 秒。
    • 优化建议:
      • 调低 refresh_interval(如设置为 30s)减少段生成频率,平衡实时性与写入性能。
      • 对实时性要求高的场景,使用 GET /_doc/{id} 直接访问文档(依赖 _source 而非正排索引)。
4. 查询场景的局限性
  1. 无法高效支持全文搜索
    • 正排索引的定位:正排索引设计用于按文档访问字段值,而非通过词项定位文档。
    • 全文搜索依赖倒排索引:若仅依赖正排索引,全文搜索需遍历所有文档,性能极差。
    • 对比示例:
      • 倒排索引:搜索 “error” 直接定位倒排列表,复杂度 O(1)。
      • 正排索引:需遍历所有文档的 message 字段,复杂度 O(N)。
  2. 范围查询的局限性
    • 非数值字段的低效性:对非数值字段(如 keyword)执行范围查询(如 “a” TO “z”),需遍历字典映射,性能较差。
    • 优化建议:
      • 对需要范围查询的字符串字段,使用 text 类型分词后结合倒排索引。
      • 对数值或日期字段,优先使用 Doc Values 的范围查询优化。

六、正排索引的用途

Elasticsearch 的正排索引(Forward Index)主要用于支持高效的字段值访问和分析操作,与倒排索引(Inverted Index)形成互补,共同满足搜索、聚合、排序等复杂场景的需求。以下是正排索引的核心用途及其实际应用场景的详细说明:

  1. 聚合(Aggregations)

    • 用途说明:正排索引通过 列式存储(Doc Values) 高效支持聚合操作,如统计字段分布、计算平均值/总和等。
    • 优势:列式数据连续存储,便于批量遍历,压缩率高,减少磁盘 I/O。
    • 示例:
      GET sales/_search
      {"aggs": {"total_sales": { "sum": { "field": "amount" } },"category_distribution": { "terms": { "field": "product_category.keyword" } }}
      }
      
      • amount 字段的 Doc Values 直接遍历所有值求和。
      • product_category.keyword 的 Doc Values 统计每个类别的文档数。
  2. 排序(Sorting)

    • 用途说明:通过正排索引快速访问字段值,对搜索结果按指定字段排序。
    • 优势:直接读取列式数据,避免解析 _source,性能显著提升。
    • 示例:
      GET products/_search
      {"sort": [{ "price": { "order": "desc" } },  // 使用 price 字段的 Doc Values{ "_score": "desc" }]
      }
      
  3. 脚本计算(Scripting)

    • 用途说明:在查询脚本中动态访问字段值,支持复杂计算逻辑。
    • 优势:通过 doc[‘field’].value 直接读取 Doc Values,延迟低。
    • 示例:
      GET products/_search
      {"script_fields": {"discounted_price": {"script": "doc['price'].value * 0.9"  // 使用 price 字段的 Doc Values}}
      }
      
  4. 高亮显示(Highlighting)

    • 用途说明:快速返回字段原始内容,用于搜索结果的高亮展示。
    • 优势:若字段设置为 store: true,可直接从 Store Fields 读取数据,跳过解析 _source 的开销。
    • 示例:
      GET articles/_search
      {"query": { "match": { "content": "Elasticsearch" } },"highlight": {"fields": { "content": {} }  // 从 Store Fields 或 _source 获取原始内容}
      }
      
  5. 部分字段返回(Stored Fields)

    • 用途说明:直接返回指定字段的原始值,无需解析完整 _source。
    • 优势:减少网络传输和 JSON 解析开销,提升响应速度。
    • 示例:
      GET logs/_search
      {"stored_fields": ["timestamp", "status_code"],  // 从 Store Fields 获取"query": { "match_all": {} }
      }
      
  6. 范围查询(Range Queries)

    • 用途说明:对数值、日期等字段执行范围查询时,正排索引优化数据访问。
    • 优势:列式存储天然有序,支持快速范围过滤。
    • 示例:
      GET logs/_search
      {"query": {"range": {"timestamp": {"gte": "2023-01-01","lte": "2023-12-31"}}}
      }
      
  7. 字段值存在性检查(Exists Query)

    • 用途说明:快速判断某字段是否存在非空值。
    • 优势:直接遍历 Doc Values 检查字段值的非空性。
    • 示例:
      GET users/_search
      {"query": {"exists": { "field": "email" }  // 检查 email 字段是否有值}
      }
      
  8. 地理空间分析(Geospatial Analytics)

    • 用途说明:对地理坐标字段(如 geo_point)进行聚合或距离计算。
    • 优势:Doc Values 支持高效的地理数据遍历。
    • 示例:
      GET locations/_search
      {"aggs": {"heatmap": {"geohash_grid": { "field": "coordinates", "precision": 5 }}}
      }
      
  9. 多字段组合分析

    • 用途说明:在复杂分析场景中,联合使用多个字段的 Doc Values。
    • 示例:
      GET sales/_search
      {"aggs": {"sales_by_region": {"terms": { "field": "region.keyword" },  // 使用 region 的 Doc Values"aggs": {"avg_amount": { "avg": { "field": "amount" } }  // 使用 amount 的 Doc Values}}}
      }
      
  10. 时序数据分析(Time Series)

    • 用途说明:针对时间序列数据(如日志、指标),利用 Doc Values 高效处理时间范围聚合。
    • 示例:
      GET metrics/_search
      {"aggs": {"hourly_stats": {"date_histogram": {"field": "timestamp","calendar_interval": "1h"},"aggs": { "avg_value": { "avg": { "field": "value" } } }}}
      }
      

七、正排索引的优化策略

Elasticsearch 的正排索引(Forward Index)优化策略需结合存储效率、查询性能、写入速度等多方面因素。以下是系统化的优化方案,涵盖配置调整、数据结构设计及硬件调优:

  1. 存储优化

    • 按需启用 Doc Values
      • 禁用非必要字段:对不参与聚合、排序的字段关闭 Doc Values。
        PUT my_index/_mapping
        {"properties": {"log_message": {"type": "text","doc_values": false  // 关闭聚合能力,减少存储}}
        }
        
      • 高基数字段特殊处理:唯一ID等字段建议禁用 Doc Values,改用倒排索引。
    • 避免冗余存储
      • 慎用 store: true:仅对高频访问字段(如标题、摘要)启用存储字段。
        PUT my_index/_mapping
        {"properties": {"title": {"type": "text","store": true  // 显式存储,用于快速返回}}
        }
        
      • 依赖 _source 作为主存储:默认通过 _source 返回数据,减少冗余。
    • 压缩优化
      • 数值类型优化:
        • 使用最小化数据类型(如 byte 替代 integer)。
        • 启用 index_options: docs 减少倒排索引开销(仅记录文档ID)。
      • 字符串类型优化:
        • 使用 keyword 类型代替 text 进行聚合。
        • 对长文本禁用 norms 和 index_options。
  2. 查询性能优化

    • 全局序号(Global Ordinals)预热
      • 启用 eager_global_ordinals:对高基数字段预加载字典映射,减少首次聚合延迟。
        PUT my_index/_mapping
        {"properties": {"user_id": {"type": "keyword","eager_global_ordinals": true  // 预加载字典}}
        }
        
    • 缓存策略
      • 聚合结果缓存:对重复查询使用 cache: true。
        GET sales/_search
        {"aggs": {"total_sales": {"sum": { "field": "amount", "missing": 0 }}},"size": 0,"request_cache": true  // 启用查询缓存
        }
        
    • 分页优化
      • 避免深度分页:使用 search_after 替代 from/size,减少内存占用。
      • 聚合分页:对海量数据聚合使用 composite 分桶。
  3. 写入性能优化

    • 降低 Refresh 频率
      • 增大 refresh_interval,减少段生成频率:
        PUT my_index/_settings
        {"index.refresh_interval": "30s"  // 默认1s,调整为30秒
        }
        
    • 批量写入
      • 使用 bulk API 批量提交数据,减少 IOPS 压力。
      • 控制单批次文档数(建议 5-15MB/批次)。
    • 关闭副本写入
      • 写入高峰期临时关闭副本,写入完成后再恢复:
        PUT my_index/_settings
        {"index.number_of_replicas": 0
        }
        
  4. 数据结构与映射优化

    • 字段类型选择
      • 数值类型:优先使用 integer、short、byte 等最小化类型。
      • 时间类型:使用 date 而非 text 或 keyword。
      • 高维数据:地理位置使用 geo_point,IP地址使用 ip 类型。
    • 多字段(Multi-fields)设计
      • 对文本字段同时支持搜索和聚合:
        PUT my_index/_mapping
        {"properties": {"message": {"type": "text",        // 支持全文搜索"fields": {"keyword": { "type": "keyword"  // 支持聚合}}}}
        }
        
    • 避免嵌套对象
      • 扁平化数据结构,减少 nested 类型使用(因其 Doc Values 效率较低)。
  5. 硬件与架构优化

    • 分片策略
      • 控制分片大小:单个分片建议 10-50GB(过小导致段过多,过大影响并行性)。
      • 预创建索引:对时序数据按时间滚动(如每日索引),避免分片膨胀。
    • 存储介质
      • 使用 SSD 提升 IOPS,尤其对高写入场景。
      • 确保足够内存,保障文件系统缓存(Page Cache)容量。
    • 冷热架构
      • 对历史数据迁移至冷节点(使用高压缩率存储),热节点专注实时查询。

相关文章:

Elasticsearch 正排索引

一、正排索引基础概念 在 Elasticsearch 中&#xff0c;正排索引用于存储完整的文档内容&#xff0c;以便通过文档ID 快速定位文档的字段值。正排索引通过 Doc Values 和 Store Fields 两种形式&#xff0c;为聚合、排序、脚本计算等场景提供高效支持。Doc Values 的列式存储设…...

Spring实现WebScoket

SpringWeb编程方式分为Servlet模式和响应式。Servlet模式参考官方文档&#xff1a;Web on Servlet Stack :: Spring Framework&#xff0c;响应式&#xff08;Reacive&#xff09;参考官方文档&#xff1a;Web on Reactive Stack :: Spring Framework。 WebSocket也有两种编程方…...

Token是什么?

李升伟 整理 “Token” 是一个多义词&#xff0c;具体含义取决于上下文。以下是几种常见的解释&#xff1a; 1. 计算机科学中的 Token 定义&#xff1a;在编程和计算机科学中&#xff0c;Token 是源代码经过词法分析后生成的最小单位&#xff0c;通常用于编译器和解释器。 …...

odoo-045 ModuleNotFoundError: No module named ‘_sqlite3‘

文章目录 一、问题二、解决思路 一、问题 就是项目启动&#xff0c;本来好好地&#xff0c;忽然有一天报错&#xff0c;不知道什么原因。 背景&#xff1a; 我是在虚拟环境中使用的python3.7。 二、解决思路 虚拟环境和公共环境直接安装 sqlite3 都会报找不到这个库的问题…...

cesium加载CTB生成的地形数据

由于CTB生成的地形数据是压缩的&#xff08;gzip&#xff09;格式&#xff0c;需要在nginx加上特殊配置才可以正常加载&#xff0c;NGINX全部配置如下 worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/o…...

前端JS高阶技法:序列化、反序列化与多态融合实战

✨ 摘要 序列化与反序列化作为数据转换的核心能力&#xff0c;与多态这一灵活代码设计的核心理念&#xff0c;在现代前端开发中协同运作&#xff0c;提供了高效的数据通信与扩展性支持。 本文从理论到实践&#xff0c;系统解析&#xff1a; 序列化与反序列化的实现方式、使用…...

TS中的Class

基本用法 implements implements 关键字用于传递对类产生约束的数据类型 interface AnimalInfo{name:stringrace:stringage:number }interface AnimalCls{info:AnimalInfosayName():void} class Animal implements AnimalCls{info:AnimalInfoconstructor(info:AnimalInfo) {t…...

RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程

在需要控制和被控制的电脑上安装软件 github开源仓库地址 https://github.com/rustdesk/rustdesk/releases 蓝奏云盘备份 ( exe ) https://geek7.lanzouw.com/iPf592sadqrc 密码:4esi 中继服务器设置 使用docker安装 sudo docker image pull rustdesk/rustdesk-server sudo…...

【计网速通】计算机网络核心知识点与高频考点——数据链路层(二)

数据链路层核心知识点&#xff08;二&#xff09; 涵盖局域网、广域网、介质访问控制&#xff08;MAC层&#xff09;及数据链路层设备 上文链接&#xff1a;https://blog.csdn.net/weixin_73492487/article/details/146571476 一、局域网&#xff08;LAN,Loacl Area Network&am…...

STM32单片机入门学习——第3-4节: [2-1、2]软件安装和新建工程

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.01 STM32开发板学习——第一节&#xff1a; [1-1]课程简介 前言开发板说明引用解答和…...

W3C XML Schema 活动

W3C XML Schema 活动 概述 W3C XML Schema(XML Schema)是万维网联盟(W3C)定义的一种数据描述语言,用于定义XML文档的结构和约束。XML Schema为XML文档提供了一种结构化的方式,确保数据的一致性和有效性。本文将详细介绍W3C XML Schema的活动,包括其发展历程、主要特点…...

爬虫【Scrapy-redis分布式爬虫】

Scrapy-redis分布式爬虫 1.Scrapy-redis实现增量爬虫 增量爬虫的含义 就是前面所说的的暂停、恢复爬取 安装 # 使用scrapy-redis之前最好将scrapy版本保持在2.8.0版本, 因为2.11.0版本有兼容性问题 pip install scrapy==2.8.0 pip install scrapy-redis -i https://pypi.tun…...

intellij Idea 和 dataGrip下载和安装教程

亲测有效 第一步&#xff1a;卸载老版本idea/Datagrip &#xff08;没有安装过的可跳过此步骤&#xff09; 第二步&#xff1a;下载idea/dataGrip安装包 建议选择2022以后的版本 官网&#xff1a; https://www.jetbrains.com/datagrip/download/other.html 选择dataGrip 的…...

轻量级搜索接口技术解析:快速实现关键词检索的Java/Python实践

Hi&#xff0c;你好&#xff01; 轻量级搜索接口技术解析&#xff1a;快速实现关键词检索的Java/Python实践 接口特性与适用场景 本接口适用于需要快速集成搜索能力的开发场景&#xff0c;支持通过关键词获取结构化搜索结果。典型应用场景包括&#xff1a; 垂直领域信息检索…...

架构设计基础系列:事件溯源模式浅析

图片来源网络&#xff0c;侵权删 ‌1. 引言‌ ‌1.1 研究背景‌ 传统CRUD模型的局限性&#xff1a;状态覆盖导致审计困难、无法追溯历史。分布式系统复杂性的提升&#xff1a;微服务架构下数据一致性、回滚与调试的需求激增。监管合规性要求&#xff1a;金融、医疗等领域对数…...

ResNet系列和ViT系列预训练模型权重文件下载

一、简单介绍 OpenAI CLIP项目提供的预训练模型权重文件列表&#xff0c;主要包含两种架构系列和不同规模配置&#xff1a; ResNet系列 (RN) 基础版本&#xff1a;RN50&#xff08;ResNet-50&#xff09;扩展版本&#xff1a;RN50x4、RN50x16、RN50x64&#xff08;宽度扩展&am…...

【力扣hot100题】(035)二叉树的中序遍历

正常方法递归很简单&#xff0c;于是又学了一种栈的方法。 原理如下&#xff1a;每次循环先尽量将目前节点入栈并左移&#xff0c;没有左节点时回到栈首节点将目前节点放入结果容器中并移出栈外&#xff0c;目前节点变为该节点的右节点&#xff0c;循环结束条件是目前节点为nu…...

《数字图像处理》教材寻找合作者

Rafael Gonzalez和Richard Woods所著的《数字图像处理》关于滤波器的部分几乎全错&#xff0c;完全从零开始写&#xff0c;困难重重。关于他的问题已经描述在《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》。 现寻找能够共同讨论、切磋、…...

批量删除 txt/html/json/xml/csv 等文本文件中的重复行

在文本文件中&#xff0c;可能会存在一些重复的数据行&#xff0c;这可能不是我们期望的&#xff0c;因此我们会碰到需要删除文本文件中重复行的情况。如果是人工删除&#xff0c;当文件较大或者数量较多的时候&#xff0c;处理的难度会较大。今天就给大家介绍一下批量删除文本…...

LangChain 使用向量数据库介绍与使用

LangChain 是一个用于构建大语言模型(LLM)应用的框架,而向量数据库在 LangChain 中主要用于实现检索增强生成(RAG, Retrieval-Augmented Generation),即通过向量搜索从外部知识库中快速检索相关信息,辅助大模型生成更准确的回答。以下是具体的使用方法: 1. 核心流程 L…...

基于微信小程序的智慧乡村旅游服务平台【附源码】

基于微信小程序的智慧乡村旅游服务平台&#xff08;源码L文说明文档&#xff09; 目录 4系统设计 4.1系统功能设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1旅游景点管理…...

d202542

一、142.环形链表I 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 用set统计一下 如果再次出现那么就环的第一个return返回就行 public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while(cur ! …...

NodeTextFileCollectorScrapeError 报警原因及解决方法

现象 prometheus 经常有告警 NodeTextFileCollectorScrapeError 查看 node-exporter 日志出现如下报错 time2025-04-01T06:43:18.266Z levelERROR sourcetextfile.go:248 msg"failed to collect textfile data" collectortextfile fileipmitool.prom err"fail…...

RapidJSON 处理 JSON(高性能 C++ 库)(四)

第四部分:RapidJSON 处理 JSON(高性能 C++ 库) 📢 快速掌握 JSON!文章 + 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 RapidJSON 课程视频!🎬 视频里会用更直观的方式讲解 RapidJSON 的核心概念、实战技巧,并配有…...

80. Linux内核定时器实验

一、Linux内核定时器原理 1.1、内核时间管理 1、Cortex-M内核使用systick作为系统定时器。 2、硬件定时器、软件定时器&#xff0c;原理是依靠系统定时器来驱动。 3、linux内核频率可以配置&#xff0c;图形化界面配置。 4、重点&#xff0c;HZ表示系统节拍率&#xff0c; 1.…...

Java 可变参数全解析:动态参数传递的实践指南

Java 可变参数全解析&#xff1a;动态参数传递的实践指南 一、可变参数&#xff1a;Java 方法的灵活扩展 在狂神说 Java 第 49 集课程中&#xff0c;我们系统学习了 Java 可变参数的核心原理。作为 Java SE 5 引入的重要特性&#xff0c;可变参数允许方法接受动态数量的输入&…...

C++类与对象(上):从入门到实践

目录 一、引言 二、面向过程和面向对象初步认识 2.1 面向过程编程 2.2 面向对象编程 三、类的引入 四、类的定义 4.1 定义格式 4.2 定义方式 4.3 成员变量命名规则建议 五、类的访问限定符及封装 5.1 访问限定符 5.2 封装 六、类的作用域 七、类的实例化 7.1 概念…...

Lumerical ------ Edge coupler design

Lumerical ------ Edge coupler design 引言正文无 Si Substrate 的仿真步骤有 Si Substrate 的仿真步骤引言 本文,我们将使用官方提供的 Edge coupler 设计教程,但是中间会带有作者本人的设计的感悟。 正文 无 Si Substrate 的仿真步骤 打开 Edge_Coupler_No_Substrate.l…...

大语言模型本质上还是自动化,而不是智能化

大语言模型本质上仍然是自动化或高级自动化&#xff0c;而非真正的智能化&#xff0c;原因可以从以下几个方面进行分析&#xff1a;1、自动化与智能化的本质区别自动化&#xff1a;大语言模型通过预训练和微调&#xff0c;基于大量数据和规则生成输出。它的行为是基于输入数据的…...

cmake 中的命令

命令描述示例capabilities报告 CMake 内置的功能&#xff0c;以 JSON 格式输出cmake -E capabilitiescat连接文件并将其内容打印到标准输出cmake -E cat file1.txt file2.txtchdir在指定目录中运行命令cmake -E chdir /path/to/dir commandcompare_files比较两个文件是否相同cm…...