"Elasticsearch最新面试题2021年,常见面试题及答案汇总"
在Elasticsearch中,执行搜索的方式多种多样,主要可以分为以下三种:
1. **基于DSL检索**:这是最常见的搜索方式,Elasticsearch提供了一种基于JSON的查询Domain Specific Language (DSL)。例如,以下代码展示了如何通过DSL进行布尔查询,筛选颜色为红色且品牌为Gucci的衬衫:
```json
GET shirts/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "color": "red" } },
{ "term": { "brand": "gucci" } }
]
}
}
}
```
2. **基于URL检索**:这是一种简洁的搜索方式,适用于简单的查询。如在my_index索引中查找user字段为seina的记录:
```bash
GET /my_index/_search?q=user:seina
```
3. **类SQL检索**:虽然Elasticsearch支持类似于SQL的查询语法,但这功能并不完备,通常不推荐作为主要的查询方式。例如,以下示例按itemid降序排列并限制返回5条记录:
```json
POST /_sql?format=txt
{
"query": "SELECT * FROM uint-2020-08-17 ORDER BY itemid DESC LIMIT 5"
}
```
对于大数据量(如上亿量级)的聚合操作,Elasticsearch提供了高效的方法。例如,`cardinality`度量聚合是一个很好的选择,它可以估算字段的基数,即该字段的唯一值数量。它基于HyperLogLog (HLL) 算法,该算法通过哈希运算和位操作进行近似的基数统计,能够在较小的内存开销下处理大量数据。用户可以调整精度参数以控制内存使用,但需要注意的是,更高的精度意味着更多的内存消耗。
Elasticsearch索引文档的过程是一个涉及多个步骤的分布式操作:
1. **第一步**:客户端向集群中的任意节点发送文档写入请求。如果未指定路由或协调节点,请求的节点将承担路由职责。
2. **第二步**:接收到请求的节点(比如节点1)根据文档_id确定所属的分片,假设是分片0,然后将请求转发到分片0的主分片所在的节点(比如节点3)。
3. **第三步**:节点3在主分片上执行写操作。如果成功,它会并行地将更新请求转发到分片0的所有副本分片(如节点1和节点2)。
4. **第四步**:每个副本分片执行写操作,并将响应返回给节点3。
5. **第五步**:当所有副本都成功写入后,节点3确认写入操作完成,并将结果返回给初始的请求节点。
这个过程确保了数据的高可用性和容错性,即使在节点故障的情况下,也能通过副本分片恢复数据。在实际应用中,还可以通过设置副本数量和调整其他参数来优化写入性能和数据安全性。