面试题答案
一键面试具体步骤
- 构建查询请求体:使用 Elasticsearch 的查询 DSL(Domain Specific Language)来构造查询。在
query
部分使用bool
查询,因为bool
查询可以组合多个子查询条件,在filter
子句中设置范围过滤条件。 示例如下:
{
"query": {
"bool": {
"filter": [
{
"range": {
"price": {
"gte": 100,
"lte": 500
}
}
}
]
}
}
}
在上述示例中,假设商品价格字段名为 price
,gte
表示大于等于(greater than or equal to),lte
表示小于等于(less than or equal to)。
- 发送请求:通过 Elasticsearch 的客户端(如 Elasticsearch 的 REST API 客户端、官方提供的各种语言的客户端等)将构建好的查询请求发送到 Elasticsearch 集群。
实现原理
- 倒排索引:Elasticsearch 使用倒排索引结构。对于每个字段值,倒排索引会记录包含该值的文档列表及相关位置信息。在范围过滤时,Elasticsearch 会利用倒排索引快速定位符合条件的文档。
- 过滤执行:
filter
子句中的范围过滤条件不会像query
子句那样计算相关性分数。Elasticsearch 会在倒排索引中查找满足价格范围的文档集合。它会遍历索引数据结构,从索引中直接获取符合price
字段值在 100 到 500 之间的文档 ID 列表。这种过滤操作通常会被缓存,以便后续相同的过滤请求可以直接使用缓存结果,从而提高查询效率。与query
子句相比,filter
子句更侧重于数据筛选,性能更高,适合用于不影响文档相关性分数的纯过滤场景,如按价格范围筛选商品文档。