一、基礎概念
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。
原創文章,作者:PCXA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/143446.html