共计 1297 个字符,预计需要花费 4 分钟才能阅读完成。
搜索系统的重要性与工作原理
搜索系统是现代应用的基石,从电商商品检索到内容平台的信息查找都离不开它。它的核心原理可概括为三步:

- 数据预处理:将原始文本分词、归一化(如转为小写),去除停用词(的、是等无意义词)
- 建立索引:构建类似字典的快速查找结构(如倒排索引记录词→文档的映射)
- 查询处理:解析用户输入,按相关性排序返回结果
搜索技术对比
1. 全文检索(如 Elasticsearch/Lucene)
- 优点:
- 成熟稳定,支持复杂条件组合(AND/OR/NOT)
- 毫秒级响应,适合结构化 / 半结构化数据
- 缺点:
- 对自然语言理解能力有限
- 依赖关键词精确匹配
- 场景:商品搜索、日志分析
2. 语义搜索(如 BERT)
- 优点:
- 理解查询意图(搜 ” 安卓充电头 ” 也能匹配 ”Type- C 数据线 ”)
- 支持同义词扩展
- 缺点:
- 计算资源消耗大
- 训练成本高
- 场景:客服问答、法律条文查询
3. 向量搜索(如 Faiss)
- 优点:
- 支持图片、音视频等非文本搜索
- 相似度计算精准
- 缺点:
- 索引体积大
- 更新成本高
- 场景:推荐系统、以图搜图
Elasticsearch 实战
索引创建示例
// 创建商品索引(含 IK 中文分词)PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word", // 细粒度分词
"search_analyzer": "ik_smart" // 搜索时粗粒度
},
"price": {"type": "double"},
"tags": {"type": "keyword"} // 精确匹配
}
}
}
基础查询 DSL
GET /products/_search
{
"query": {
"bool": {
"must": [{ "match": { "name": "无线耳机"}},
{"range": { "price": { "gte": 100, "lte": 500} }}
],
"filter": [{ "term": { "tags": "蓝牙"} }
]
}
},
"highlight": {
"fields": {"name": {}
}
}
}
性能优化
索引设计三原则
- 冷热分离:频繁查询的字段设为
"index": true,不检索的设"index": false - 避免过度分析 :数值型 ID 等应用
keyword而非text类型 - 合理使用嵌套:嵌套对象不超过 3 层,否则考虑父子文档
查询优化技巧
- 使用
filter替代must(利用缓存) - 避免
wildcard查询(如* 手机 *) - 分页深度超过 1000 时改用
search_after
生产环境要点
集群配置
- 分片数 = 数据量(GB)/30GB(单个分片建议不超过 30GB)
- 副本数 ≥ 1(保证高可用)
监控关键指标
# 查看集群健康
GET _cluster/health
# 监控热点线程
GET _nodes/hot_threads
进阶思考
- 如何实现搜索结果的个性化排序(如结合用户历史行为)?
- 当索引数据达到 TB 级时,有哪些架构优化方案?
- 怎样设计 A / B 测试框架评估搜索效果改进?
构建搜索系统就像搭积木,先掌握基础组件再逐步扩展。建议从 Elasticsearch 官方文档开始实践,遇到问题时多观察日志和监控指标。记住:没有最好的方案,只有最适合业务场景的设计。
正文完
发表至: 技术分享
近一天内
