新闻搜索领域性能优化:从索引构建到查询加速全攻略

新闻搜索领域性能优化:从索引构建到查询加速全攻略

关键词:新闻搜索、倒排索引、分词优化、查询加速、实时索引、缓存策略、分布式架构

摘要:新闻搜索是媒体平台的核心功能,用户对“秒级响应”和“精准结果”的需求日益增长。本文从新闻搜索的全流程出发,结合生活场景类比与技术原理,详细讲解从索引构建到查询加速的性能优化策略,涵盖分词效率提升、倒排索引压缩、实时增量更新、查询缓存设计等关键环节,并通过实战案例演示具体实现方法,帮助开发者掌握新闻搜索性能优化的“底层逻辑”。


背景介绍

目的和范围

新闻搜索的核心挑战是“又快又准”:用户输入关键词后,系统需在1秒内从百万级新闻库中筛选出最新、最相关的内容。本文聚焦“性能优化”,覆盖从原始新闻数据到用户看到搜索结果的全流程,重点讲解索引构建(如何高效组织数据)和查询加速(如何快速返回结果)的关键技术。

预期读者

  • 对搜索技术感兴趣的开发者(想了解新闻搜索背后的“黑匣子”)
  • 媒体平台后端工程师(需优化现有搜索系统性能)
  • 计算机相关专业学生(想通过实际场景理解信息检索原理)

文档结构概述

本文从“生活场景”切入,用“超市买菜”类比新闻搜索流程;逐步拆解核心概念(分词、倒排索引、缓存);结合数学公式(如BM25排序)和代码示例(Python实现简易索引)讲解技术原理;最后通过实战案例演示如何优化一个新闻搜索系统。

术语表

  • 倒排索引:一种“关键词→文档列表”的映射结构(类似字典的“拼音→汉字”目录)。
  • 分词:将连续文本切割为有意义的词语(如“北京冬奥会”拆为“北京”“冬奥会”)。
  • BM25:一种经典的文本相关性排序算法(比“词频”更智能的“打分规则”)。
  • 近实时索引(NRT):支持秒级数据更新的索引技术(新闻发布后几秒内即可被搜索到)。

核心概念与联系

故事引入:超市买菜的搜索启示

假设你要在大型超市找“新疆哈密瓜”,超市的“商品摆放”和“导购方式”决定了找货速度:

  1. 商品摆放(索引构建):如果所有水果按“产地+种类”分区(如“新疆区→哈密瓜”“山东区→苹果”),找起来很快;如果随便堆成一堆,找半天也找不到。
  2. 导购工具(查询加速):如果有电子屏显示“哈密瓜在3楼A区”(类似缓存),或导购员直接带你去(类似预计算),比自己瞎转快得多。

新闻搜索的原理类似:索引构建是“给新闻数据合理摆放”,查询加速是“提供高效导购工具”

核心概念解释(像给小学生讲故事)

核心概念一:分词——切菜式的文本拆解

分词就像切菜:你要炒“番茄鸡蛋”,需要先把“番茄”切成块,“鸡蛋”打成液。新闻文本是“一整根黄瓜”,分词是把它切成“黄瓜片”(有意义的词语)。
例:新闻标题“2023年杭州亚运会开幕”会被拆成“2023年”“杭州”“亚运会”“开幕”。
关键问题:切错了会影响搜索(比如“乒乓球拍卖完了”拆成“乒乓球拍”还是“乒乓球”“拍卖”?)。

核心概念二:倒排索引——字典目录式的快速查找

倒排索引是新闻搜索的“超级目录”。想象字典的“拼音目录”:输入“han”,能找到所有拼音以“han”开头的字(如“汉”“含”“韩”)。倒排索引类似,但记录的是“关键词→包含该词的新闻列表”。
例:关键词“杭州”对应新闻列表[新闻A(2023杭州亚运会)、新闻B(杭州西湖美景)、新闻C(杭州美食攻略)]。
关键优势:查询“杭州”时,直接从倒排索引中取出对应新闻列表,无需遍历所有新闻。

核心概念三:查询加速——超市导购的“快捷通道”

查询加速是让搜索结果“更快出现”的技巧。比如超市的“常用商品区”(缓存)、提前标好的“今日特价”(预计算)、多个收银员同时结账(分布式计算)。新闻搜索中,常用的加速手段有:

  • 缓存:保存高频查询的结果(如“俄乌冲突”每天被搜10万次,直接返回缓存结果)。
  • 预计算:提前算好热门关键词的排序(如“世界杯”相关新闻的BM25分数,查询时直接取)。
  • 分布式:把新闻库拆成多个部分(如按时间分区),多个服务器同时查,结果合并(类似多个人分头找哈密瓜,再汇总位置)。

核心概念之间的关系(用小学生能理解的比喻)

分词、倒排索引、查询加速是“搜索三兄弟”,合作流程像“做蛋糕”:

  1. 分词是“揉面”(把面团揉成小剂子,对应文本拆成词语)。
  2. 倒排索引是“蛋糕架”(把小剂子按口味分类摆放,对应关键词映射新闻列表)。
  3. 查询加速是“烤箱”(快速烘烤出蛋糕,对应快速返回结果)。
  • 分词与倒排索引的关系:分词是倒排索引的“原材料”。如果分词错误(比如“乒乓球拍”拆成“乒乓球”+“拍”),倒排索引会把新闻错误归类(“拍”可能关联到“拍照”新闻),导致搜索结果不准。
  • 倒排索引与查询加速的关系:倒排索引是“基础地图”,查询加速是“导航软件”。地图越清晰(索引结构越高效),导航越快(查询响应越短);导航软件的优化(缓存、预计算)能弥补地图的不足(比如旧地图未更新时,缓存保存了新路线)。
  • 分词与查询加速的关系:分词越准,查询时需要处理的关键词越少(比如“杭州亚运会”正确分词后,只需查“杭州”和“亚运会”两个关键词,而不是错误拆成“杭”“州”“亚”等无效词),加速效果越明显。

核心概念原理和架构的文本示意图

新闻搜索全流程可简化为:
原始新闻 → 分词器(切词) → 倒排索引构建器(生成关键词→新闻映射) → 索引库(存储倒排索引) → 查询处理器(接收用户关键词,查索引库,排序,返回结果)

Mermaid 流程图

原始新闻数据
分词器
倒排索引构建器
索引库
用户查询
查询处理器
缓存系统
排序算法
返回结果

核心算法原理 & 具体操作步骤

分词算法:从“切错菜”到“精准切”

分词是新闻搜索的“第一关”,常见算法有:

  • 基于词典的正向最大匹配:像查词典一样,从左到右取最长匹配词。
    例:词典有“杭州”“亚运会”,文本“杭州亚运会”会被拆成“杭州”+“亚运会”(而非“杭”+“州”+“亚”+“运会”)。
  • 基于统计的机器学习(如BERT分词):通过大量文本训练模型,判断词语边界(适合处理生僻词,如“元宇宙”“AI大模型”)。

Python示例(正向最大匹配)

def max_match(text, dictionary):
    max_len = max(len(word) for word in dictionary)  # 词典中最长词的长度
    result = []
    index = 0
    while index < len(text):
        # 从当前位置取最长可能的词
        word = text[index:index+max_len] if index+max_len <= len(text) else text[index:]
        while word not in dictionary and len(word) > 1:
            word = word[:-1]  # 缩短词长度
        if word in dictionary:
            result.append(word)
            index += len(word)
        else:  # 未匹配到,单字处理
            result.append(text[index])
            index += 1
    return result

# 示例词典
dictionary = {"杭州", "亚运会", "2023年", "开幕"}
text = "2023年杭州亚运会开幕"
print(max_match(text, dictionary))  # 输出:['2023年', '杭州', '亚运会', '开幕']

倒排索引构建:从“乱序仓库”到“精准目录”

倒排索引的核心是“关键词→(新闻ID,词频,位置)”的映射。构建步骤:

  1. 收集新闻数据:从爬虫或数据库获取新闻标题、正文、发布时间。
  2. 分词处理:用分词器拆分成词语列表。
  3. 统计词频与位置:记录每个词在新闻中的出现次数(词频,影响相关性)和位置(如标题中的词更重要)。
  4. 构建倒排列表:按关键词分组,生成“关键词→新闻列表”的映射。

Python示例(简易倒排索引)

from collections import defaultdict

class InvertedIndex:
    def __init__(self):
        self.index = defaultdict(list)  # 关键词→[(新闻ID, 词频)]
    
    def add_document(self, doc_id, text, tokenizer):
        tokens = tokenizer(text)  # 使用分词器拆词
        token_counts = defaultdict(int)
        for token in tokens:
            token_counts[token] += 1  # 统计词频
        for token, count in token_counts.items():
            self.index[token].append((doc_id, count))

# 初始化索引和分词器
index = InvertedIndex()
tokenizer = lambda text: max_match(text, dictionary)  # 使用前面的分词函数

# 添加新闻数据
news1 = {"id": 1, "text": "2023年杭州亚运会开幕"}
news2 = {"id": 2, "text": "杭州西湖美景"}
index.add_document(news1["id"], news1["text"], tokenizer)
index.add_document(news2["id"], news2["text"], tokenizer)

# 查询关键词“杭州”的倒排列表
print(index.index["杭州"])  # 输出:[(1, 1), (2, 1)](新闻1和新闻2各出现1次)

查询排序算法:BM25——比“词频”更聪明的打分规则

用户搜索时,系统需要从倒排列表中筛选新闻,并按相关性排序。BM25是最常用的排序算法,公式:
B M 25 = ∑ q i ∈ Q ( k 1 + 1 ) ⋅ t f ( q i , d ) k 1 ⋅ ( 1 − b + b ⋅ l e n ( d ) a v g _ l e n ) + t f ( q i , d ) ⋅ log ⁡ ( N − n ( q i ) + 0.5 n ( q i ) + 0.5 ) BM25 = \sum_{q_i \in Q} \frac{(k_1 + 1) \cdot tf(q_i, d)}{k_1 \cdot (1 - b + b \cdot \frac{len(d)}{avg\_len}) + tf(q_i, d)} \cdot \log\left(\frac{N - n(q_i) + 0.5}{n(q_i) + 0.5}\right) BM25=qiQk1(1b+bavg_lenlen(d))+tf(qi,d)(k1+1)tf(qi,d)log(n(qi)+0.5Nn(qi)+0.5)

  • t f ( q i , d ) tf(q_i, d) tf(qi,d):词 q i q_i qi在文档 d d d中的词频。
  • l e n ( d ) len(d) len(d):文档 d d d的长度, a v g _ l e n avg\_len avg_len:所有文档的平均长度(避免长文档因词多占便宜)。
  • N N N:总文档数, n ( q i ) n(q_i) n(qi):包含 q i q_i qi的文档数(稀有词权重更高)。
  • k 1 k_1 k1 b b b是可调参数(通常 k 1 = 1.2 k_1=1.2 k1=1.2, b = 0.75 b=0.75 b=0.75)。

通俗解释:BM25给“在目标文档中出现次数多、在其他文档中出现次数少、且文档长度适中”的关键词更高分。例如,“杭州”在新闻A(短文本)中出现2次,在新闻B(长文本)中出现3次,但新闻A的BM25分可能更高,因为长文本的词频被“打折”了。


数学模型和公式 & 详细讲解 & 举例说明

以BM25为例,假设:

  • 总新闻数 N = 1000 N=1000 N=1000,包含“杭州”的新闻数 n ( q i ) = 100 n(q_i)=100 n(qi)=100,平均新闻长度 a v g _ l e n = 50 avg\_len=50 avg_len=50
  • 新闻A长度 l e n ( d ) = 30 len(d)=30 len(d)=30,“杭州”词频 t f = 2 tf=2 tf=2;新闻B长度 l e n ( d ) = 100 len(d)=100 len(d)=100,“杭州”词频 t f = 3 tf=3 tf=3

计算新闻A的BM25分数( k 1 = 1.2 k_1=1.2 k1=1.2, b = 0.75 b=0.75 b=0.75):
分子 = ( 1.2 + 1 ) × 2 = 4.4 分母 = 1.2 × ( 1 − 0.75 + 0.75 × 30 50 ) + 2 = 1.2 × ( 0.25 + 0.45 ) + 2 = 1.2 × 0.7 + 2 = 0.84 + 2 = 2.84 词频部分 = 4.4 / 2.84 ≈ 1.55 逆文档频率 = log ⁡ ( 1000 − 100 + 0.5 100 + 0.5 ) = log ⁡ ( 900.5 100.5 ) ≈ log ⁡ ( 8.96 ) ≈ 2.19 BM25总分 = 1.55 × 2.19 ≈ 3.40 \begin{align*} \text{分子} &= (1.2 + 1) \times 2 = 4.4 \\ \text{分母} &= 1.2 \times (1 - 0.75 + 0.75 \times \frac{30}{50}) + 2 \\ &= 1.2 \times (0.25 + 0.45) + 2 \\ &= 1.2 \times 0.7 + 2 = 0.84 + 2 = 2.84 \\ \text{词频部分} &= 4.4 / 2.84 ≈ 1.55 \\ \text{逆文档频率} &= \log\left(\frac{1000 - 100 + 0.5}{100 + 0.5}\right) = \log\left(\frac{900.5}{100.5}\right) ≈ \log(8.96) ≈ 2.19 \\ \text{BM25总分} &= 1.55 \times 2.19 ≈ 3.40 \\ \end{align*} 分子分母词频部分逆文档频率BM25总分=(1.2+1)×2=4.4=1.2×(10.75+0.75×5030)+2=1.2×(0.25+0.45)+2=1.2×0.7+2=0.84+2=2.84=4.4/2.841.55=log(100+0.51000100+0.5)=log(100.5900.5)log(8.96)2.19=1.55×2.193.40

新闻B的BM25分数:
分母 = 1.2 × ( 0.25 + 0.75 × 100 50 ) + 3 = 1.2 × ( 0.25 + 1.5 ) + 3 = 1.2 × 1.75 + 3 = 2.1 + 3 = 5.1 词频部分 = ( 2.2 × 3 ) / 5.1 ≈ 6.6 / 5.1 ≈ 1.29 BM25总分 = 1.29 × 2.19 ≈ 2.82 \begin{align*} \text{分母} &= 1.2 \times (0.25 + 0.75 \times \frac{100}{50}) + 3 \\ &= 1.2 \times (0.25 + 1.5) + 3 \\ &= 1.2 \times 1.75 + 3 = 2.1 + 3 = 5.1 \\ \text{词频部分} &= (2.2 \times 3) / 5.1 ≈ 6.6 / 5.1 ≈ 1.29 \\ \text{BM25总分} &= 1.29 \times 2.19 ≈ 2.82 \\ \end{align*} 分母词频部分BM25总分=1.2×(0.25+0.75×50100)+3=1.2×(0.25+1.5)+3=1.2×1.75+3=2.1+3=5.1=(2.2×3)/5.16.6/5.11.29=1.29×2.192.82
结论:虽然新闻B的“杭州”词频更高,但因文档过长,BM25分反而低于新闻A,更符合用户对“短文本中核心词更重要”的直觉。


项目实战:代码实际案例和详细解释说明

开发环境搭建

我们将用Python实现一个简易新闻搜索系统,依赖以下工具:

  • jieba分词(替代前面的正向最大匹配,更高效)。
  • Elasticsearch(工业级搜索引擎,演示分布式索引)。
  • Redis(缓存高频查询结果)。

环境配置步骤

  1. 安装Python 3.8+,并安装依赖:pip install jieba elasticsearch redis
  2. 本地启动Elasticsearch(默认端口9200)和Redis(默认端口6379)。

源代码详细实现和代码解读

步骤1:新闻数据爬取与预处理(模拟)

假设我们有一个新闻数据库,每条新闻包含id(唯一标识)、title(标题)、content(正文)、publish_time(发布时间)。

# 模拟新闻数据
news_data = [
    {"id": 1, "title": "2023杭州亚运会盛大开幕", "content": "9月23日,杭州亚运会在奥体中心开幕...", "publish_time": "2023-09-23"},
    {"id": 2, "title": "杭州西湖秋日美景如画", "content": "秋季的西湖,枫叶红了,游客如织...", "publish_time": "2023-10-05"},
    {"id": 3, "title": "北京冬奥会回顾", "content": "2022年北京冬奥会是史上最成功的冬奥会...", "publish_time": "2022-02-04"},
]
步骤2:构建倒排索引(使用Elasticsearch)

Elasticsearch是基于Lucene的分布式搜索引擎,内置高效的倒排索引构建功能。

from elasticsearch import Elasticsearch

# 连接Elasticsearch
es = Elasticsearch(["http://localhost:9200"])

# 创建新闻索引(类似数据库的表)
index_name = "news_index"
es.indices.create(
    index=index_name,
    body={
        "mappings": {
            "properties": {
                "title": {"type": "text", "analyzer": "ik_max_word"},  # 使用ik分词器(支持中文)
                "content": {"type": "text", "analyzer": "ik_max_word"},
                "publish_time": {"type": "date"}
            }
        }
    }
)

# 批量插入新闻数据(自动构建倒排索引)
for news in news_data:
    es.index(index=index_name, id=news["id"], document=news)

关键参数解释

  • analyzer="ik_max_word":使用IK分词器,支持中文分词(如“杭州亚运会”拆为“杭州”“亚运”“亚运会”等)。
  • publish_time设为date类型:支持按时间范围查询(如“最近7天的新闻”)。
步骤3:实现查询接口(含缓存优化)

使用Redis缓存高频查询结果,减少Elasticsearch的压力。

import redis
from datetime import datetime

# 连接Redis
r = redis.Redis(host="localhost", port=6379, db=0)

def search_news(keyword, days=7):
    # 检查缓存(缓存键格式:search:{keyword}:{days})
    cache_key = f"search:{keyword}:{days}"
    cached_result = r.get(cache_key)
    if cached_result:
        return eval(cached_result)  # 假设缓存存储的是字符串化的列表
    
    # 未命中缓存,查询Elasticsearch
    end_time = datetime.now()
    start_time = end_time.replace(day=end_time.day - days)
    query_body = {
        "query": {
            "bool": {
                "must": [
                    {"multi_match": {"query": keyword, "fields": ["title", "content"]}},  # 标题和正文都搜索
                    {"range": {"publish_time": {"gte": start_time, "lte": end_time}}}  # 最近7天
                ]
            }
        },
        "sort": [{"publish_time": {"order": "desc"}}]  # 按发布时间倒序(最新新闻在前)
    }
    response = es.search(index=index_name, body=query_body)
    
    # 提取结果(新闻ID、标题、发布时间)
    result = [
        {
            "id": hit["_id"],
            "title": hit["_source"]["title"],
            "publish_time": hit["_source"]["publish_time"]
        }
        for hit in response["hits"]["hits"]
    ]
    
    # 缓存结果(有效期1小时)
    r.setex(cache_key, 3600, str(result))
    return result

# 测试查询“杭州”
print(search_news("杭州"))

代码解读与分析

  • 分词优化:使用IK分词器替代简单的正向最大匹配,支持更精准的中文分词(如“亚运会”会被正确识别)。
  • 倒排索引构建:Elasticsearch自动处理分词、词频统计、位置记录,开发者无需手动实现。
  • 缓存策略:高频查询(如“杭州”)的结果存入Redis,下次查询直接返回,减少Elasticsearch的计算压力。
  • 排序优化:按发布时间倒序,确保用户优先看到最新新闻(符合新闻搜索的“时效性”需求)。

实际应用场景

1. 新闻客户端实时搜索

用户在“新浪新闻”APP输入“华为”,系统需在500ms内返回最新的100条相关新闻。通过以下优化实现:

  • 实时索引:新闻发布后,通过Elasticsearch的NRT(近实时)功能,3秒内更新索引。
  • 缓存热点词:“华为”是高频词,缓存其搜索结果,避免重复计算。

2. 媒体平台内容检索

“人民日报”后台编辑需要搜索历史新闻(如“2020年抗疫报道”),系统需支持:

  • 跨时间范围查询:通过Elasticsearch的range查询,快速筛选指定时间内的新闻。
  • 多字段搜索:同时搜索标题、正文、标签,提升召回率。

3. 舆情监控快速查询

企业需要监控“品牌名”的新闻,系统需:

  • 高并发处理:通过Elasticsearch分布式集群(多节点),支撑每秒数千次查询。
  • 精准排序:结合BM25和情感分析(如负面新闻优先提示),提升结果相关性。

工具和资源推荐

类型工具/资源说明
分词器IK Analyzer中文分词神器,支持自定义词典(适合新闻领域专业词,如“元宇宙”“东数西算”)。
搜索引擎Elasticsearch工业级分布式搜索引擎,内置倒排索引、分词、排序功能,支持Docker快速部署。
缓存工具Redis高性能内存数据库,适合缓存高频查询结果(设置合理的过期时间避免内存溢出)。
分布式计算Hadoop/Spark处理海量新闻数据时,用MapReduce并行构建倒排索引(适合离线全量索引更新)。
学习资料《信息检索导论》经典教材,详细讲解倒排索引、排序算法等原理。
社区Elasticsearch中文社区遇到问题时,可在社区提问(https://elasticsearch.cn/)。

未来发展趋势与挑战

趋势1:实时索引技术升级

新闻的“时效性”要求越来越高(如突发新闻需秒级可搜索),未来可能出现:

  • 增量索引优化:仅更新变化的新闻(而非全量重建索引),减少资源消耗。
  • 内存索引:部分高频新闻存入内存(如Redis),实现微秒级查询。

趋势2:多模态搜索融合

新闻内容从纯文本扩展到“文本+图片+视频”,搜索需支持:

  • 跨模态检索:输入文本查询图片(如“杭州亚运会火炬”搜索相关图片)。
  • 多模态分词:识别图片中的文字(OCR)和视频的语音(ASR),统一构建索引。

挑战1:海量数据的存储与计算

全球每天新增数百万条新闻,倒排索引的存储量可能达到TB级,需解决:

  • 索引压缩:通过算法减少倒排列表的存储空间(如使用Frame of Reference编码)。
  • 分布式协调:多节点索引的一致性(如某节点更新后,其他节点如何快速同步)。

挑战2:用户意图的精准理解

用户搜索“杭州”可能是找“亚运会新闻”“旅游攻略”或“天气”,未来需:

  • 查询意图识别:结合用户历史行为(点击过旅游新闻)和上下文(当前在旅游频道),调整排序策略。
  • 动态词权重:根据实时热点(如“杭州亚运会”期间,“杭州”的权重提升),优化BM25参数。

总结:学到了什么?

核心概念回顾

  • 分词:将文本拆成有意义的词语(新闻搜索的“第一关”)。
  • 倒排索引:“关键词→新闻列表”的映射(搜索的“超级目录”)。
  • 查询加速:通过缓存、预计算、分布式等技术,让结果“更快出现”。

概念关系回顾

分词是倒排索引的“原材料”,倒排索引是查询加速的“基础地图”,查询加速是弥补索引不足的“导航软件”。三者协作,共同实现新闻搜索的“又快又准”。


思考题:动动小脑筋

  1. 假设你负责一个地方新闻平台的搜索优化,用户常搜索“本地美食”,但结果中总出现“全国美食”新闻。你会如何优化?(提示:考虑分词词典、倒排索引的“地域标签”、排序算法的权重调整)

  2. 新闻的“时效性”要求很高,比如“今日热点”需秒级可搜索。传统的全量索引(每天重建一次)无法满足需求,你会如何设计“实时增量索引”?(提示:参考Elasticsearch的translog机制,记录增量变更)

  3. 用户搜索“北京”时,希望优先看到“最近3天”的新闻,其次是“最近1个月”的。如何通过排序算法(如BM25)和Elasticsearch的function_score实现?(提示:给“最近3天”的新闻额外加分)


附录:常见问题与解答

Q:分词错误会影响搜索结果吗?
A:会!例如,“乒乓球拍卖完了”错误拆成“乒乓球”“拍卖”,搜索“乒乓球拍”时可能找不到该新闻(因为索引中只有“乒乓球”和“拍卖”)。

Q:倒排索引的存储量很大,如何压缩?
A:常用压缩方法有:

  • 词项压缩:对重复的关键词(如“的”“是”)使用短编码。
  • 倒排列表压缩:用差值编码(记录新闻ID的增量,而非绝对值),如新闻ID列表[1,3,5]可存为[1,2,2](3-1=2,5-3=2)。

Q:缓存热点查询时,如何避免“缓存击穿”(热点键过期后大量请求涌向后端)?
A:可以设置“缓存预热”(提前加载热点键),或使用“互斥锁”(仅一个请求回源加载,其他请求等待)。


扩展阅读 & 参考资料

  • 《Elasticsearch: 权威指南》—— 深入理解Elasticsearch的索引与查询原理。
  • 《统计自然语言处理》—— 学习分词、文本相似度计算的数学模型。
  • Elasticsearch官方文档(https://www.elastic.co/guide/)—— 最新功能与最佳实践。
  • 阿里云搜索服务(https://www.aliyun.com/product/opensearch)—— 企业级新闻搜索解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值