MST

星途 面试题库

面试题:ElasticSearch 中如何通过过滤器实现范围条件过滤及其原理

在 ElasticSearch 中,假设你有一个存储商品价格的索引,现在要筛选出价格在100到500之间的商品文档,描述使用过滤器实现此范围条件过滤的具体步骤,并简要阐述其背后的实现原理。
12.6万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

具体步骤

  1. 构建查询请求体:使用 Elasticsearch 的查询 DSL(Domain Specific Language)来构造查询。在 query 部分使用 bool 查询,因为 bool 查询可以组合多个子查询条件,在 filter 子句中设置范围过滤条件。 示例如下:
{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "price": {
                            "gte": 100,
                            "lte": 500
                        }
                    }
                }
            ]
        }
    }
}

在上述示例中,假设商品价格字段名为 pricegte 表示大于等于(greater than or equal to),lte 表示小于等于(less than or equal to)。

  1. 发送请求:通过 Elasticsearch 的客户端(如 Elasticsearch 的 REST API 客户端、官方提供的各种语言的客户端等)将构建好的查询请求发送到 Elasticsearch 集群。

实现原理

  1. 倒排索引:Elasticsearch 使用倒排索引结构。对于每个字段值,倒排索引会记录包含该值的文档列表及相关位置信息。在范围过滤时,Elasticsearch 会利用倒排索引快速定位符合条件的文档。
  2. 过滤执行filter 子句中的范围过滤条件不会像 query 子句那样计算相关性分数。Elasticsearch 会在倒排索引中查找满足价格范围的文档集合。它会遍历索引数据结构,从索引中直接获取符合 price 字段值在 100 到 500 之间的文档 ID 列表。这种过滤操作通常会被缓存,以便后续相同的过滤请求可以直接使用缓存结果,从而提高查询效率。与 query 子句相比,filter 子句更侧重于数据筛选,性能更高,适合用于不影响文档相关性分数的纯过滤场景,如按价格范围筛选商品文档。