ElasticSearch搜索技术深入与聚合查询实战
- 相关性与相关性算分详解
相关性(Relevance)
定义:衡量查询结果与搜索条件的匹配程度,由相关性算分(Score)量化。
核心算法:
TF-IDF(ElasticSearch 5.x 之前)
TF(Term Frequency):词项在文档中出现的频率。
IDF(Inverse Document Frequency):词项在整个文档集合中的稀有程度。
缺点:
长文档中高频词项可能被过度加权。
未考虑词项位置、文档长度等因素。
BM25(ElasticSearch 5.x 及以后)
优势:
对长文档更友好,避免词频过度影响。
支持动态调整参数以适应不同场景。
- 基于Boosting控制相关性算分
Boosting
作用:调整查询条件的权重,提升或降低某些字段的得分。
示例:提升
title 字段的权重至2倍,降低
content 字段至0.5倍。
GET /products/_search
{
“query”: {
“bool”: {
“should”: [
{ “match”: { “title”: { “query”: “phone”, “boost”: 2 } } },
{ “match”: { “content”: { “query”: “phone”, “boost”: 0.5 } } }
]
}
}
}
注意:
boost 值可大于1(提升)或介于0-1(降权)。
- 布尔查询(Bool Query)语法详解
布尔查询结构
组合逻辑:
must(AND)、
should(OR)、
must_not(NOT)、
filter(不参与算分)。
示例:搜索包含
“apple” 且不包含
“banana” 的文档,并过滤价格大于100的商品。
GET /products/_search
{
“query”: {
“bool”: {
“must”: [ { “match”: { “name”: “apple” } } ],
“must_not”: [ { “match”: { “name”: “banana” } } ],
“filter”: [ { “range”: { “price”: { “gt”: 100 } } } ]
}
}
}
优化建议:
filter 不计算相关性,适合精确过滤(如状态、范围)。
minimum_should_match 控制
should 子句的最小匹配数。
- 单字符串多字段查询优化
策略对比
策略适用场景示例查询类型Best Fields多个字段中至少有一个字段高度匹配multi_match + type: best_fieldsMost Fields多个字段合并评分(如不同分词器处理的相同字段)multi_match + type: most_fieldsCross Field关键词需分散在多个字段中组合匹配multi_match + type: cross_fields示例:Cross Field 查询
GET /articles/_search
{
“query”: {
“multi_match”: {
“query”: “ElasticSearch performance”,
“fields”: [“title”, “content”],
“type”: “cross_fields”,
“operator”: “and” // 要求所有词项在字段中联合匹配
}
}
}
- ElasticSearch聚合操作详解
聚合类型
类型功能描述示例Metric Aggregation计算数值指标(如平均值、最大值)avg, sum, maxBucket Aggregation将文档分组(如按时间、类别分组)terms, date_histogramPipeline Aggregation基于其他聚合结果进行二次计算avg_bucket, cumulative_sum示例 1:Metric 聚合(计算平均价格)
GET /products/_search
{
“size”: 0,
“aggs”: {
“avg_price”: { “avg”: { “field”: “price” } }
}
}
示例 2:Bucket 聚合(按类别分组统计)
GET /products/_search
{
“size”: 0,
“aggs”: {
“categories”: {
“terms”: { “field”: “category.keyword” },
“aggs”: { “avg_price”: { “avg”: { “field”: “price” } } }
}
}
}
聚合不精准原因分析
分布式架构:数据分布在多个分片,聚合时各分片独立计算后合并,可能导致近似结果。
默认策略:
terms 聚合默认返回前10个分片中的高频词项(可通过
size 调整)。
聚合性能优化
预过滤数据:使用
query 减少参与聚合的文档数量。
使用 execution_hint: map:直接遍历文档字段值,跳过倒排索引(适用于高基数字段)。
调整分片大小:设置
shard_size 提升精度(如
shard_size = size * 1.5 + 10)。
避免深度嵌套:减少多层聚合嵌套,优化内存使用。
总结
相关性算分:BM25 算法更适应现代搜索场景,支持动态参数调优。
布尔查询:灵活组合
must/
should/
filter,兼顾精度与性能。
多字段查询优化:
best_fields 适用于“最佳匹配”场景。
cross_fields 解决跨字段联合匹配问题。
聚合分析:
分桶(Bucket)与指标(Metric)结合,实现复杂数据分析。
性能优化需权衡精度与资源消耗,合理使用预计算(如
keyword 类型)。
实际场景建议:
高频聚合字段设为
keyword 类型,避免动态分词。
对海量数据聚合时,优先使用
filter 缩小数据集范围。
监控聚合内存使用,避免因
terms 聚合的
size 过大导致节点内存溢出。