MST

星途 面试题库

面试题:ElasticSearch复杂查询删除的URL参数配置

现有一个ElasticSearch索引'sales',文档结构包含'product_name'、'sale_date'、'quantity'和'customer_city'等字段。要求通过URL参数设置,删除特定城市(如'New York')在某个时间段(如2023 - 01 - 01到2023 - 12 - 31)内销售数量大于100的所有销售记录。请详细写出URL及每个参数的作用,并且解释在实际生产环境中可能遇到的问题及应对方法。
49.5万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. URL
DELETE /sales/_delete_by_query
  1. 请求体参数(通过URL后的请求体发送,这里以JSON格式为例)
{
    "query": {
        "bool": {
            "filter": [
                {
                    "range": {
                        "sale_date": {
                            "gte": "2023-01-01",
                            "lte": "2023-12-31"
                        }
                    }
                },
                {
                    "term": {
                        "customer_city.keyword": "New York"
                    }
                },
                {
                    "range": {
                        "quantity": {
                            "gt": 100
                        }
                    }
                }
            ]
        }
    }
}
  • query:定义查询条件,用来筛选要删除的文档。
  • bool:布尔查询,用于组合多个查询条件。
  • filter:过滤条件,在这个数组中可以放置多个过滤子条件。
  • range:范围查询,这里用于sale_date字段,限定日期范围,gte表示大于等于,lte表示小于等于。
  • term:精确匹配查询,customer_city.keyword用于精确匹配城市名称,这里使用.keyword后缀是因为customer_city字段可能是文本类型,需要通过.keyword获取精确值。
  • 第二个range:用于quantity字段,限定销售数量大于100,gt表示大于。
  1. 实际生产环境中可能遇到的问题及应对方法
  • 数据量过大
    • 问题:如果符合条件的数据量非常大,一次性删除可能会对集群性能产生严重影响,甚至导致集群不稳定。
    • 应对方法:可以使用滚动(Scroll)API进行分批删除,每次删除一定数量的文档,降低对集群的压力。
  • 误删风险
    • 问题:如果查询条件编写错误,可能会误删大量不应该删除的数据。
    • 应对方法:在生产环境执行删除操作前,先在测试环境使用相同的查询条件进行模拟删除(只查询不删除,通过_search API查看符合条件的数据),确保查询条件准确无误。同时,在生产环境执行时,可以先对数据进行备份,以便在误删的情况下能够恢复数据。
  • 版本冲突
    • 问题:在并发环境下,当一个文档正在被删除时,另一个操作可能尝试修改它,导致版本冲突。
    • 应对方法:可以在请求中增加version_type参数,设置为externalexternal_gte等,通过版本号来确保删除操作的一致性。
  • 集群负载
    • 问题:删除操作会占用集群资源,可能影响其他正常的读写操作。
    • 应对方法:可以选择在集群负载较低的时间段执行删除操作,或者通过调整集群资源分配,为删除操作预留一定的资源。