华为云Elasticsearch实现网站日志全文检索:从数据采集到智能分析的全栈实战指南
1. 引言:网站日志全文检索为何需要Elasticsearch
网站日志是运维与运营人员的"数据金矿"。每一秒钟,Web服务器、应用服务器、负载均衡器都在产生海量的日志记录,这些日志中蕴藏着用户行为、系统性能、安全威胁等关键信息。然而,传统的grep命令或数据库like查询在面对TB级日志数据时显得力不从心——查询响应缓慢、无法支持复杂的条件组合、难以进行统计分析。Elasticsearch的出现彻底改变了这一局面。
华为云云搜索服务(Cloud Search Service,简称CSS)是基于开源Elasticsearch打造的全托管分布式搜索服务。CSS不仅完全兼容Elasticsearch原生接口与生态工具链,更在内核层面进行了深度增强:日志写入性能提升50%、聚合分析性能提升200%、支持存算分离使冷数据存储成本下降80%。这些特性使得华为云Elasticsearch成为网站日志全文检索的理想平台。
本文将从零开始,手把手讲解如何利用华为云CSS服务搭建一套完整的网站日志全文检索系统,涵盖集群创建、索引设计、日志采集、全文检索查询、性能优化与可视化分析等全链路环节。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2. 华为云CSS服务概述与集群创建
2.1 云搜索服务CSS是什么
华为云CSS是ELK生态在华为云上的托管实现,集成了Elasticsearch、Logstash、Kibana、Beats等核心组件。用户无需关心底层服务器的运维、补丁升级、集群监控等繁琐工作,只需聚焦于业务逻辑与数据价值的挖掘。CSS支持Elasticsearch和OpenSearch两种引擎,本文聚焦于Elasticsearch引擎。
CSS的核心优势体现在以下几个方面:
- 完全托管:一键创建集群、一键扩容、一键重启,从小规模测试到大规模上线均可轻松完成
- 内核增强:华为云对开源Elasticsearch进行了深度优化,写入与查询性能均有显著提升
- 存算分离:冷数据可自动转存至OBS,存储成本降低80%
- 智能运维:内置智能运维模块,全面检测集群潜在风险并输出处理建议
- 生态兼容:完全兼容开源Elasticsearch语法与API,无缝对接Logstash、Kibana、Beats等工具
2.2 创建Elasticsearch集群
在华为云控制台创建CSS Elasticsearch集群的步骤如下:
- 登录华为云控制台,在服务列表中选择"云搜索服务 CSS"
- 点击"创建集群",选择"Elasticsearch"引擎
- 配置集群基本信息:集群名称、版本(建议选择7.10.2及以上版本)、可用区
- 配置节点规格:包括节点数量、规格(CPU/内存)、存储类型(建议选择超高IO型SSD以提升写入性能)
- 配置网络:选择VPC和子网,确保与日志源ECS在同一VPC内以实现内网高速传输
- 设置集群访问控制:可选择安全模式(启用用户名密码认证)或非安全模式
- 确认配置并创建,等待集群状态变为"可用"
创建完成后,集群详情页会提供内网访问地址,后续Logstash和Kibana将使用该地址连接集群。
3. 网站日志索引设计:Mapping与索引模板
索引设计是全文检索系统的基石。良好的索引设计能显著提升查询性能、降低存储成本、简化数据管理。网站日志通常包含结构化字段(如状态码、响应时间)、半结构化字段(如User-Agent)和非结构化字段(如请求URL、Referer),Elasticsearch的倒排索引机制能够同时对所有这些类型的数据提供高效的全文检索能力。
3.1 倒排索引原理简述
Elasticsearch的全文检索能力建立在倒排索引(Inverted Index)之上。与传统数据库的正向索引(记录→字段)不同,倒排索引是"词项→文档列表"的映射结构。当一篇文档被索引时,Elasticsearch会使用分词器(Analyzer)将文本切分为一个个词项(Term),然后建立词项到文档ID的映射表。查询时,用户输入的关键词同样经过分词器处理,然后在倒排索引中快速定位到包含这些词项的文档。这种机制使得Elasticsearch能够在亿万级文档中实现毫秒级的全文检索响应。
3.2 网站日志典型字段设计
以Nginx访问日志为例,典型的日志字段及其Elasticsearch数据类型设计如下:
{
"@timestamp": {"type": "date"},
"client_ip": {"type": "ip"},
"http_method": {"type": "keyword"},
"request_url": {"type": "text", "analyzer": "standard"},
"request_url_keyword": {"type": "keyword"},
"http_status": {"type": "integer"},
"response_size": {"type": "long"},
"response_time": {"type": "float"},
"referer": {"type": "text", "analyzer": "standard"},
"user_agent": {"type": "text", "analyzer": "standard"},
"server_name": {"type": "keyword"},
"upstream_addr": {"type": "keyword"},
"upstream_status": {"type": "integer"},
"upstream_response_time": {"type": "float"}
}字段设计的关键原则:
- text vs keyword:需要全文检索的字段(如request_url、referer、user_agent)使用text类型并指定分词器;需要精确匹配、排序或聚合的字段(如http_method、server_name)使用keyword类型
- 多字段(multi-fields):对于既需要全文检索又需要精确匹配的字段,可使用多字段特性。例如request_url同时配置text和keyword两个子字段
- 时间字段:统一使用date类型,便于时间范围查询与统计
- 数值字段:状态码、响应大小等使用integer或long,响应时间使用float或double
3.3 索引模板配置
网站日志按天滚动索引是业界标准实践(如nginx-logs-2026-06-30)。为每个新索引手动创建Mapping既不现实也不可靠,因此需要配置索引模板(Index Template),让所有匹配命名模式的新索引自动继承预定义的Settings和Mappings。
以下是一个完整的索引模板配置示例(使用可组合模板,适用于Elasticsearch 7.x及以上版本):
PUT _index_template/nginx-logs-template
{
"index_patterns": ["nginx-logs-*"],
"priority": 100,
"template": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "30s",
"index.mapping.total_fields.limit": 2000,
"index.query.default_field": ["request_url", "referer", "user_agent"]
},
"mappings": {
"properties": {
"@timestamp": {"type": "date"},
"client_ip": {"type": "ip"},
"http_method": {"type": "keyword"},
"request_url": {
"type": "text",
"analyzer": "standard",
"fields": {
"keyword": {"type": "keyword", "ignore_above": 256}
}
},
"http_status": {"type": "integer"},
"response_size": {"type": "long"},
"response_time": {"type": "float"},
"referer": {
"type": "text",
"analyzer": "standard",
"fields": {
"keyword": {"type": "keyword", "ignore_above": 256}
}
},
"user_agent": {
"type": "text",
"analyzer": "standard"
},
"server_name": {"type": "keyword"},
"upstream_addr": {"type": "keyword"},
"upstream_status": {"type": "integer"},
"upstream_response_time": {"type": "float"}
}
},
"aliases": {
"nginx-logs": {}
}
}
}模板配置要点解析:
- index_patterns:匹配所有以"nginx-logs-"开头的索引
- number_of_shards:主分片数量,根据数据量预估,一般设置为数据节点数量的1-2倍
- number_of_replicas:副本数量,至少为1以保证高可用
- refresh_interval:索引刷新间隔,日志场景可适当调大(如30s)以减少写入开销
- default_field:设置默认查询字段,简化查询语句
- 别名(alias):为所有匹配的索引创建统一别名nginx-logs,查询时使用别名即可覆盖所有历史数据
4. 日志采集管道:Filebeat + Logstash 实战
日志数据从产生到进入Elasticsearch需要经过采集、传输、解析、清洗等环节。华为云CSS的最佳实践推荐使用Filebeat作为轻量级日志采集器部署在应用服务器上,通过Logstash进行数据解析与增强,最终写入Elasticsearch。Kafka可作为消息缓冲队列置于Filebeat与Logstash之间,用于削峰填谷。
4.1 部署与配置Filebeat
Filebeat是ELK栈中的轻量级日志采集器,资源消耗极低,适合部署在每一台应用服务器上。在华为云ECS上部署Filebeat的步骤如下:
- 下载Filebeat(建议版本与Elasticsearch保持一致,如7.10.2)
- 解压并编辑配置文件filebeat.yml
以下是一个采集Nginx访问日志并发送至Logstash的filebeat.yml配置示例:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
fields_under_root: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# 输出到Logstash
output.logstash:
hosts: [":5044"]
# 如需直接输出到Elasticsearch(跳过Logstash),可配置:
# output.elasticsearch:
# hosts: [":9200"]
# username: "elastic"
# password: "<密码>" 对于日志量较大的业务场景,filebeat.yml的默认配置较为保守,需要进行调优:
# 调大harvester_buffer_size,每个harvester监控文件时使用的缓冲区大小
harvester_buffer_size: 40960000
# 调大spool_size,一次Publish上传的日志行数
filebeat.spool_size: 250000
# 调整idle_timeout,spooler超时时间
filebeat.idle_timeout: 1s
# 调整output端的worker数量(与ES节点数一致)
worker: 3
# 调大bulk_max_size,批量API索引请求的最大事件数
bulk_max_size: 150004.2 部署与配置Logstash
Logstash是ELK栈中的数据处理管道,负责接收、过滤、转换和输出数据。在华为云场景中,Logstash通常部署在独立的ECS上,与CSS集群处于同一VPC内。Logstash的核心是管道(Pipeline)配置,由输入(Input)、过滤器(Filter)、输出(Output)三部分组成。
以下是一个完整的Logstash管道配置示例,用于接收Filebeat传来的Nginx日志、解析日志格式、进行字段增强后输出至CSS集群:
input {
beats {
port => 5044
}
}
filter {
# 使用Grok解析Nginx日志格式
grok {
match => {
"message" => "%{IP:client_ip} - %{USER:remote_user} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_method} %{URIPATH:request_url}(?:\?%{GREEDYDATA:query_string})? HTTP/%{NUMBER:http_version}\" %{NUMBER:http_status} %{NUMBER:response_size} \"%{DATA:referer}\" \"%{DATA:user_agent}\""
}
}
# 将timestamp字段转换为@timestamp
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
remove_field => [ "timestamp" ]
}
# 提取User-Agent中的设备、浏览器、操作系统信息
useragent {
source => "user_agent"
target => "ua_parsed"
}
# 移除原始message字段以节省存储空间
mutate {
remove_field => [ "message", "remote_user", "http_version", "query_string" ]
}
# 转换字段类型
mutate {
convert => {
"response_size" => "integer"
"http_status" => "integer"
}
}
# 添加索引日期字段(按天分索引)
mutate {
add_field => { "[index_date]" => "%{+YYYY.MM.dd}" }
}
}
output {
elasticsearch {
hosts => [":9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
user => "elastic"
password => "<密码>"
# 调优批量写入参数
bulk_size => 5000
flush_size => 500
idle_flush_time => 1
}
# 可选:输出到控制台用于调试
# stdout { codec => rubydebug }
} Logstash配置要点:
- Grok模式:Grok是Logstash中最强大的解析工具,通过预定义的正则表达式模式将非结构化的日志文本解析为结构化字段
- Date插件:将日志中的时间字符串转换为Elasticsearch的date类型,确保时间范围查询的准确性
- UserAgent插件:自动解析User-Agent字符串,提取设备类型、浏览器、操作系统等信息,便于后续分析
- 索引命名:使用%{+YYYY.MM.dd}动态生成按天滚动的索引名称
5. 全文检索查询实战
数据进入Elasticsearch后,真正的价值在于检索与分析。Elasticsearch提供了丰富而强大的全文检索查询DSL(Domain Specific Language),覆盖从简单关键词匹配到复杂布尔组合的各种场景。
5.1 match查询:基础全文检索
match查询是最常用的全文检索查询,它对查询字符串进行分词后匹配索引中的text类型字段。
GET /nginx-logs/_search
{
"query": {
"match": {
"request_url": "/api/v1/users"
}
}
}上述查询会搜索request_url字段中包含"/api"、"/v1"、"users"等词项的文档,并按相关性评分排序返回。
5.2 multi_match查询:跨多字段检索
当需要在多个字段中同时搜索关键词时,使用multi_match查询:
GET /nginx-logs/_search
{
"query": {
"multi_match": {
"query": "error 500",
"fields": ["request_url", "referer", "user_agent"],
"type": "best_fields",
"operator": "or"
}
}
}multi_match支持多种匹配类型:best_fields(默认,取最高分字段的评分)、most_fields(综合所有字段评分)、cross_fields(跨字段匹配,适用于人名等场景)等。
5.3 query_string查询:强大的Lucene语法
query_string查询支持完整的Lucene查询语法,适合高级用户构建复杂的布尔组合查询:
GET /nginx-logs/_search
{
"query": {
"query_string": {
"default_field": "request_url",
"query": "(error OR timeout) AND http_status:500 AND response_time:>1.0"
}
}
}query_string支持AND、OR、NOT、字段限定、范围查询、通配符等丰富语法,但需要注意语法错误可能导致查询失败。
5.4 布尔组合查询:Bool Query
Bool Query是Elasticsearch中最强大的组合查询方式,通过must(必须匹配)、should(应该匹配)、must_not(必须不匹配)、filter(过滤,不参与评分)四个子句构建复杂查询逻辑:
GET /nginx-logs/_search
{
"query": {
"bool": {
"must": [
{ "match": { "request_url": "api" } },
{ "range": { "@timestamp": { "gte": "now-1h" } } }
],
"should": [
{ "match": { "referer": "google" } },
{ "match": { "referer": "baidu" } }
],
"must_not": [
{ "term": { "http_status": 200 } }
],
"filter": [
{ "term": { "server_name": "www.example.com" } }
]
}
}
}此查询的含义是:在过去1小时内,request_url包含"api"、http_status不是200、server_name为www.example.com的日志中,优先展示referer来自google或baidu的文档。
5.5 高亮显示
在搜索结果中高亮显示匹配的关键词,是提升用户体验的重要手段:
GET /nginx-logs/_search
{
"query": {
"match": {
"request_url": "error"
}
},
"highlight": {
"fields": {
"request_url": {
"pre_tags": [""],
"post_tags": [""]
}
}
}
}6. 聚合分析:从检索到洞察
全文检索解决了"找什么"的问题,而聚合分析(Aggregations)解决了"有多少"、"趋势如何"、"分布怎样"的问题。Elasticsearch的聚合能力与SQL中的GROUP BY、COUNT、AVG、SUM等操作类似,但性能远超传统数据库。
6.1 指标聚合
计算响应时间的平均值、最大值、百分位数等统计指标:
GET /nginx-logs/_search
{
"size": 0,
"aggs": {
"avg_response_time": {
"avg": { "field": "response_time" }
},
"max_response_time": {
"max": { "field": "response_time" }
},
"percentiles_response_time": {
"percentiles": {
"field": "response_time",
"percents": [50, 90, 95, 99]
}
}
}
}6.2 桶聚合:按状态码分组统计
GET /nginx-logs/_search
{
"size": 0,
"aggs": {
"by_status": {
"terms": {
"field": "http_status",
"size": 20
}
}
}
}6.3 时间直方图:趋势分析
GET /nginx-logs/_search
{
"size": 0,
"aggs": {
"requests_over_time": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "hour"
},
"aggs": {
"avg_response": {
"avg": { "field": "response_time" }
}
}
}
}
}7. 冷热数据分离与索引生命周期管理
网站日志数据具有典型的"热-温-冷"特征:最近几天的日志查询频率最高,需要高性能存储(热数据);一周前的日志查询频率降低,可迁移至成本较低的存储(温数据);一个月前的日志极少查询,可归档至对象存储(冷数据)。华为云CSS原生支持冷热数据分离与索引生命周期管理(ILM),帮助企业在保证查询性能的同时大幅降低存储成本。
7.1 冷热数据节点配置
在创建CSS集群时,可同时配置热数据节点(高配SSD)和冷数据节点(低配HDD)。集群创建完成后,通过节点标签(box_type)区分节点类型。
7.2 配置索引分配策略
通过索引模板将新创建的索引数据路由到热节点:
PUT _template/hot-nginx-template
{
"index_patterns": ["nginx-logs-*"],
"priority": 200,
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"routing.allocation.require.box_type": "hot"
}
}当索引达到一定天数后,通过更新索引设置将其迁移至冷节点:
PUT /nginx-logs-2026.06.29/_settings
{
"settings": {
"routing.allocation.require.box_type": "cold"
}
}7.3 索引生命周期管理(ILM)
CSS基于Open Distro的ISM(Index State Management)插件实现索引生命周期管理。通过配置策略(Policy),可自动化完成索引的滚动、迁移、冻结、删除等操作。
以下是一个完整的ISM策略配置示例:
PUT _plugins/_ism/policies/nginx-logs-policy
{
"policy": {
"description": "Nginx logs lifecycle management",
"default_state": "hot",
"states": [
{
"name": "hot",
"actions": [
{
"rollover": {
"min_doc_count": 5000000,
"min_index_age": "1d"
}
}
],
"transitions": [
{
"state_name": "warm",
"conditions": {
"min_index_age": "3d"
}
}
]
},
{
"name": "warm",
"actions": [
{
"replica_count": {
"number_of_replicas": 0
}
}
],
"transitions": [
{
"state_name": "cold",
"conditions": {
"min_index_age": "7d"
}
}
]
},
{
"name": "cold",
"actions": [
{
"freeze": {}
}
],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "30d"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}上述策略定义了完整的索引生命周期:索引创建后进入hot状态,当文档数达到500万或年龄超过1天时自动滚动;3天后进入warm状态并减少副本数;7天后进入cold状态并冻结索引;30天后自动删除。通过这种自动化管理,运维人员无需手动干预即可实现存储成本的最优化。
8. Kibana可视化分析
Kibana是Elasticsearch官方提供的可视化分析平台,CSS集群默认集成Kibana,用户可直接在集群详情页点击"访问Kibana"一键登录。
8.1 创建索引模式
在Kibana中,首先需要创建索引模式(Index Pattern)来告诉Kibana要分析哪些索引。对于本文的场景,创建索引模式"nginx-logs-*",时间字段选择"@timestamp"。
8.2 Discover:日志探索与检索
Kibana的Discover页面是日志检索的核心工具。用户可以通过以下方式进行日志探索:
- 选择时间范围(如最近15分钟、最近1小时、今天等)
- 在搜索框中输入Lucene查询语法或KQL(Kibana Query Language)
- 添加字段过滤器(如http_status:500)
- 查看日志详情,支持字段高亮显示
8.3 可视化仪表盘
Kibana提供了丰富的可视化组件,包括柱状图、折线图、饼图、数据表、热力图等。典型的网站日志分析仪表盘可包含以下可视化元素:
- 请求量时间趋势图(按小时/天)
- HTTP状态码分布饼图
- TOP 10请求URL排行
- TOP 10客户端IP排行
- 平均响应时间趋势图
- 响应时间百分位数(P50、P90、P95、P99)
这些可视化图表可以自由组合成仪表盘(Dashboard),实现网站运维态势的一屏总览。
9. 性能优化最佳实践
在实际生产环境中,日志数据量可能达到每天TB级别,查询并发可能高达数百甚至上千。以下性能优化建议基于华为云CSS的实践经验总结:
9.1 写入性能优化
- 使用SSD存储:SSD盘可大幅提升数据写入与合并操作的速度,CSS服务中建议选择"超高IO型"存储
- 调整refresh_interval:将索引刷新间隔从默认的1s调整为30s或更长,减少刷新次数带来的IO开销
- 批量写入:在Logstash中配置bulk_size和flush_size参数,采用批量方式写入ES
- 禁用或减少副本:写入阶段可将副本数设为0,写入完成后再调整为1
9.2 查询性能优化
- 增加查询缓存:通过修改集群参数配置,将indices.queries.cache.size设置为更大的值
- 合理设置分片数:每个分片大小建议控制在20GB-40GB之间,分片过多会增加查询调度开销
- 使用Filter上下文:对于不需要参与相关性评分的条件(如时间范围、状态码过滤),使用filter而非must
- 启用慢查询日志:通过配置慢查询日志阈值,识别并优化慢查询
9.3 存储优化
- 冷热分离:将历史数据迁移至冷节点,降低存储成本
- 存算分离:将冻结索引转存至OBS,存储成本降低80%
- 数据压缩:CSS支持ZSTD压缩算法,数据存储空间可降低20%
- 定期清理:通过ILM策略自动删除过期数据
10. 总结
本文系统阐述了如何利用华为云云搜索服务CSS中的Elasticsearch构建一套完整的网站日志全文检索平台。从技术选型上看,华为云CSS凭借其全托管运维、内核性能增强、存算分离等优势,为企业日志分析提供了坚实的技术底座。从架构设计上看,ELK技术栈(Elasticsearch + Logstash + Kibana + Beats)各司其职、协同工作,形成了从日志采集、传输、解析、存储到检索、分析、可视化的完整数据闭环。从实施细节上看,合理的索引模板设计、精准的字段Mapping配置、高效的日志采集管道调优、灵活的冷热数据分离策略,每一个环节都直接影响着系统的性能与成本。
网站日志全文检索不仅仅是一个技术方案,更是企业实现数据驱动运维与运营的核心能力。通过将海量非结构化日志转化为可检索、可分析、可视化的结构化数据资产,运维团队能够快速定位故障根因、精准预测系统瓶颈;运营团队能够深入洞察用户行为、持续优化产品体验。希望本文的实战指南能够帮助读者快速上手华为云Elasticsearch,构建属于自己的高效日志分析平台。
问答环节
问1:华为云CSS与自建Elasticsearch相比有哪些优势?
华为云CSS是全托管服务,用户无需关心集群的部署、配置、监控、升级、备份等运维工作。CSS在开源Elasticsearch基础上进行了内核增强:日志写入性能提升50%、聚合分析性能提升200%、支持存算分离使冷数据存储成本下降80%。同时,CSS无缝集成华为云生态,可一键对接OBS、Kafka等云服务。
问2:网站日志索引为什么要按天滚动?
按天滚动索引是日志场景的最佳实践。主要原因包括:①单个索引数据量可控,避免单索引过大影响查询性能;②便于数据生命周期管理,可按天进行冷热迁移或删除;③提升写入性能,避免所有数据写入同一个索引导致的写入瓶颈;④便于问题排查,可快速定位特定时间段的日志。
问3:Filebeat和Logstash的区别是什么?什么时候需要同时使用两者?
Filebeat是轻量级日志采集器,部署在应用服务器上,资源消耗极低。Logstash是重量级数据处理管道,负责数据的解析、过滤、增强和转换。当日志格式简单、无需复杂处理时,可让Filebeat直接输出到Elasticsearch。当需要Grok解析、字段增强、多数据源汇聚等复杂处理时,建议在Filebeat和Elasticsearch之间增加Logstash层。
问4:如何提升Elasticsearch全文检索的查询速度?
提升查询速度可从多个维度入手:①使用Filter上下文替代Must上下文进行非评分过滤;②合理设置分片数量,每个分片控制在20-40GB;③增加查询缓存(indices.queries.cache.size);④对高频查询字段使用keyword类型或启用doc_values;⑤启用慢查询日志定位性能瓶颈;⑥使用冷热分离将历史数据与热数据隔离。
问5:CSS集群的日志采集功能与Filebeat采集有什么区别?
CSS集群的日志采集功能是华为云提供的内置能力,主要用于采集CSS集群自身的运行日志、慢查询日志等,将其写入指定索引以便通过Kibana进行分析。而Filebeat是通用日志采集工具,部署在应用服务器上采集业务日志(如Nginx日志、应用日志等)。两者面向不同的日志源,可以同时使用、互为补充。
问6:网站日志数据在Elasticsearch中保留多久比较合适?
保留时长取决于业务需求与合规要求。一般建议:热数据保留3-7天(高性能SSD存储),温数据保留7-30天(普通存储),冷数据保留30天-1年(低成本存储或OBS归档)。通过索引生命周期管理(ILM)策略可自动化完成数据在不同存储层级之间的流转与过期删除。



