一、基础概念
1、什么是elasticsearch?
Elasticsearch(简称ES)是一个开源的分布式搜索引擎,能够从海量数据中快速搜索和查询数据。
// ES查询API示例
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
2、elasticsearch的核心组件有哪些?
elasticsearch的核心组件包括:
(1)节点(node):每个节点都是一个独立的elasticsearch服务器,负责存储和处理数据。
(2)索引(index):每个索引都是具有一定相似度的文档的集合,比如日志索引、产品信息索引等。
(3)分片(shard):每个索引可以被分成若干个分片,每个分片都是一个独立的lucene索引,即每个分片都是一个可被存储和查询的独立单元。
(4)副本(replica):每个分片可以有多个副本,用于提高搜索的可用性和性能。
// 创建索引、文档示例
PUT /my_index
{
"mappings": {
"properties": {
"title": {"type": "text"},
"content": {"type": "text"}
}
}
}
PUT /my_index/_doc/1
{
"title": "Elasticsearch初探",
"content": "探寻分布式搜索引擎的未来"
}
3、什么是mapping?
mapping指的是定义索引的结构、字段类型和属性。它定义了索引中每个字段的类型,字符串是否分词、数值是否存储等细节,以及字段的相关属性和分析器等。
// mapping示例
PUT /my_index
{
"mappings": {
"properties": {
"title": {"type": "text", "analyzer": "ik_smart"},
"content": {"type": "text", "analyzer": "ik_smart"},
"views": {"type": "integer"},
"created_at": {"type": "date", "format": "yyyy-MM-dd HH:mm:ss"}
}
}
}
二、搜索查询
1、什么是Query DSL?
Query DSL是elasticsearch提供的查询语法,用于构建复杂、灵活的查询。它支持多种查询语句、聚合函数、排序等功能。
// Query DSL示例
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{"match": {"title": "Elasticsearch"}},
{"match": {"content": "分布式"}}
],
"filter": [
{"range": {"views": {"gte": 1000}}},
{"range": {"created_at": {"gte": "2021-01-01", "lte": "2022-01-01"}}}
]
}
},
"sort": [
{"views": {"order": "desc"}},
{"created_at": {"order": "asc"}}
],
"aggs": {
"views_stats": {"stats": {"field": "views"}}
}
}
2、什么是match和term查询?它们有什么区别?
match查询是进行全文检索的查询,可以匹配被分词的文本,使用了elasticsearch的分词器进行处理。而term查询则是进行精确匹配的查询,不会被分词器处理。match查询支持模糊匹配,term查询不支持模糊匹配。
// match查询和term查询示例
GET /my_index/_search
{
"query": {
"match": {"title": "Elasticsearch入门"}
}
}
GET /my_index/_search
{
"query": {
"term": {"title": "Elasticsearch入门"}
}
}
3、什么是bool查询?有哪些参数可以控制bool查询的行为?
bool查询允许将多个查询语句组合在一起。它包含must、must_not、should、filter四个参数。其中,must表示必须完全匹配才能返回结果;must_not表示必须不匹配才能返回结果;should表示至少匹配一个语句才能返回结果;filter则是只要满足条件就会被返回,但不会计算评分。
bool查询还有一些参数,例如minimum_should_match(要求至少匹配几个should语句)、boost(提高某个语句的权重)等。
// bool查询示例
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{"match": {"title": "Elasticsearch"}},
{"match": {"content": "分布式"}}
],
"filter": [
{"range": {"views": {"gte": 1000}}},
{"range": {"created_at": {"gte": "2021-01-01", "lte": "2022-01-01"}}}
]
}
}
}
三、聚合分析
1、什么是聚合函数?elasticsearch支持哪些聚合函数?
聚合函数是用于对文档进行分组、统计、筛选等操作的函数。elasticsearch支持的聚合函数包括:avg、sum、min、max、cardinality、percentiles、terms等。
// 聚合函数示例
GET /my_index/_search
{
"size": 0,
"aggs": {
"views_stats": {"stats": {"field": "views"}},
"views_percentiles": {"percentiles": {"field": "views"}},
"title_count": {"cardinality": {"field": "title"}},
"tag_aggs": {"terms": {"field": "tag"}}
}
}
2、什么是bucket聚合?elasticsearch支持哪些bucket聚合?
bucket聚合是一种分组聚合,将文档分组放置在不同的桶中,并基于桶内的数据进行聚合。elasticsearch支持的bucket聚合包括:terms、date_histogram、ip_range、range等。
// bucket聚合示例
GET /my_index/_search
{
"size": 0,
"aggs": {
"views_histogram": {"date_histogram": {"field": "created_at", "interval": "1M"}, "aggs": {"views_stats": {"stats": {"field": "views"}}}},
"tag_count": {"cardinality": {"field": "tag"}},
"views_ranges": {"range": {"field": "views", "ranges": [{"to": 100}, {"from": 100, "to": 1000}, {"from": 1000}]}}
}
}
3、什么是pipeline聚合?elasticsearch支持哪些pipeline聚合?
pipeline聚合依赖于前面的bucket聚合,利用前面的桶对数据进行统计、计算等操作,并生成新的桶。elasticsearch支持的pipeline聚合包括:avg_bucket、sum_bucket、derivative、cumulative_sum、bucket_selector等。
// pipeline聚合示例
GET /my_index/_search
{
"size": 0,
"aggs": {
"views_histogram": {"date_histogram": {"field": "created_at", "interval": "1M"}, "aggs": {"views_sum": {"sum": {"field": "views"}}}},
"views_derivatives": {"derivative": {"buckets_path": "views_sum"}}
}
}
四、性能优化
1、如何提高elasticsearch的查询性能?
提高elasticsearch的查询性能可以从以下几个方面入手:
(1)选择合适的硬件条件,包括CPU、内存、磁盘等;
(2)配置适当的分片和副本,避免数据过度分散和重复;
(3)优化查询语句,避免使用昂贵的查询语句、合理使用bool查询等;
(4)使用缓存,例如elasticsearch内置的缓存和外部缓存等;
(5)定期清理过期数据,删除不必要的索引和文档等。
2、如何提高elasticsearch的数据写入性能?
提高elasticsearch的数据写入性能可以从以下几个方面入手:
(1)配置适当的bulk大小,减少网络传输时间;
(2)选择合适的索引策略,包括refresh_interval、number_of_replicas、translog等;
(3)使用Ingest节点处理预处理数据,例如解析数据和添加时间戳等;
(4)合理使用routing策略,避免数据过度分散和重复写入;
(5)避免使用分布式锁,使用乐观锁代替。
3、如何避免elasticsearch的故障?
避免elasticsearch的故障可以从以下几个方面入手:
(1)选择合适的硬件条件,避免磁盘故障、网卡故障等;
(2)备份数据和日志,保证数据的可恢复性;
(3)配置自动化监控和告警,及时发现和解决问题;
(4)进行应急测试和演练,保证应对突发情况的能力;
(5)定期升级elasticsearch版本,修复已知的安全和性能问题等。
五、小结
以上就是elasticsearch面试题及答案的详细阐述。深入掌握elasticsearch的基础概念、搜索查询、聚合分析和性能优化等方面的知识,将有助于我们更好地理解和使用elasticsearch。