Elasticsearch中的基本全文搜索和过滤
1. 索引设计与映射
-
多字段类型(Multi-Fields) :
- 文本字段默认映射为
text(全文搜索)和keyword(精确过滤)子字段。 - 示例:
title字段同时支持全文搜索(title)和精确过滤(title.keyword)。 - 作用:兼顾灵活搜索与高效过滤。
- 文本字段默认映射为
-
字段类型选择:
text:用于全文检索(如标题、描述)。keyword:用于精确匹配或聚合(如分类、标签)。date:日期类型(指定格式yyyy-MM-dd)。float:浮点数(如评分rating)。
-
分析器(Analyzer) :
- 默认使用
standard分析器(分词、转小写、去停用词)。 - 影响索引和搜索时的文本处理逻辑。
- 默认使用
2. 全文搜索技术
-
**
match查询**:-
基础全文搜索,默认
OR逻辑匹配分词后的词项。 -
支持参数:
operator:切换AND逻辑(需所有词项匹配)。minimum_should_match:控制最少匹配词项数(如2/3)。
-
-
**
multi_match查询**:- 跨多字段搜索(如同时搜索
title、description、tags)。 - 字段加权 :通过
^符号提升字段权重(如title^3)。 - 示例:优先匹配标题中的关键词。
- 跨多字段搜索(如同时搜索
3. 精确过滤方法
-
**
term查询**:- 精确匹配未经分析的字段值(必须使用
.keyword子字段)。 - 示例:
{"term": {"category.keyword": "Breakfast"}}。
- 精确匹配未经分析的字段值(必须使用
-
**
range查询**:- 数值或日期范围过滤。
- 参数:
gte(≥)、lte(≤)、gt(>)、lt(<)。 - 示例:过滤评分≥4.5的食谱。
4. 组合查询(Bool Query)
-
逻辑子句:
must:所有条件必须满足(贡献相关性得分)。should:至少满足一个条件(提升得分)。must_not:排除匹配条件(不贡献得分)。filter:过滤条件(不计算得分,性能优化)。
-
典型场景:
- 必须包含
vegetarian标签 + 评分≥4.5 + 非甜点类别。 - 示例:复合过滤与搜索条件组合。
- 必须包含
5. 性能优化与最佳实践
-
过滤优于查询:
- 使用
filter上下文避免相关性计算,提升性能。
- 使用
-
字段设计规范:
ignore_above:限制keyword字段长度(默认256字符)。- 避免长文本使用
keyword类型(节省存储)。
-
分析器选择:
- 根据业务需求定制(如中文需
ik分词器)。
- 根据业务需求定制(如中文需
6. 高级应用方向
-
相关性调优:
- 使用
function_score自定义评分公式。 - 字段长度归一化(
norms参数)。
- 使用
-
近似匹配:
match_phrase(短语匹配)。fuzzy查询(容错拼写)。
-
聚合分析(Aggregations) :
- 统计分类分布、评分分布等。
关键命令速查
bash
# 创建索引
PUT /cooking_blog
# 批量导入数据
POST /cooking_blog/_bulk?refresh=wait_for
# 基本全文搜索
GET /_search { "match": { "description": "fluffy pancakes" } }
# 多字段加权搜索
GET /_search { "multi_match": { "query": "curry", "fields": ["title^3", "description"] } }
# 复合布尔查询
GET /_search { "bool": { "must": [...], "should": [...] } }
掌握这些知识点可快速实现 精准搜索+高效过滤 的复杂需求,适用于电商、内容平台、日志分析等场景.