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": [...] } }
掌握这些知识点可快速实现 精准搜索+高效过滤 的复杂需求,适用于电商、内容平台、日志分析等场景.