Elasticsearch 的索引管理與映射配置實(shí)戰(zhàn)指南
在大數(shù)據(jù)時(shí)代,如何有效存儲(chǔ)和檢索信息成為了各行各業(yè)關(guān)注的焦點(diǎn)。Elasticsearch,作為一種開源的分布式搜索引擎,因其高效的全文搜索能力和靈活的擴(kuò)展性而受到廣泛歡迎。在使用 Elasticsearch 的過程中,索引和映射的管理是至關(guān)重要的環(huán)節(jié),它們直接影響著數(shù)據(jù)的組織結(jié)構(gòu)和查詢效率。
本文將深入探討 Elasticsearch 中索引與映射的操作,包括如何創(chuàng)建、更新和刪除索引,以及如何定義和修改映射。我們將提供實(shí)用的示例和最佳實(shí)踐,以幫助讀者掌握這些關(guān)鍵概念,并提高在 Elasticsearch 中的數(shù)據(jù)管理能力。無論你是 Elasticsearch 的新手還是有經(jīng)驗(yàn)的用戶,這篇文章都將為你提供寶貴的知識(shí)和技巧,助力你在數(shù)據(jù)處理和分析的道路上更進(jìn)一步。在 Elasticsearch 中執(zhí)行索引相關(guān)操作的基本內(nèi)容總結(jié)。
一、索引操作
(一)創(chuàng)建索引
創(chuàng)建Elasticsearch(ES)索引是在ES中存儲(chǔ)和管理數(shù)據(jù)的重要操作之一。索引是用于組織和檢索文檔的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)。
當(dāng)創(chuàng)建Elasticsearch索引時(shí),通常需要同時(shí)指定索引的設(shè)置(Settings)和映射(Mappings)。以下是一個(gè)包括索引的設(shè)置和映射的示例:
PUT /my_index
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "standard"
},
"field2": {
"type": "keyword"
},
"field3": {
"type": "integer"
},
"field4": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
在這個(gè)示例中:
settings部分包括索引的配置設(shè)置。例如,它指定了索引將被分成5個(gè)主分片(number_of_shards),并包含1個(gè)副本(number_of_replicas)。您可以根據(jù)需求自定義這些設(shè)置。mappings部分用于定義索引中的字段映射。每個(gè)字段都包括字段名、數(shù)據(jù)類型(例如,text、keyword、integer、date等)以及可選的屬性(例如,分析器、日期格式等)。
這個(gè)示例通過DSL告訴Elasticsearch如何創(chuàng)建索引、如何配置索引的主分片和副本,以及如何映射字段以便正確存儲(chǔ)和檢索文檔數(shù)據(jù)。在創(chuàng)建索引后,可以將文檔添加到索引中,并使用查詢DSL執(zhí)行各種查詢操作。
假設(shè)您正在構(gòu)建一個(gè)電子商務(wù)網(wǎng)站,需要存儲(chǔ)和檢索產(chǎn)品信息??梢远x產(chǎn)品索引的映射,包括產(chǎn)品名稱、描述、價(jià)格等字段的數(shù)據(jù)類型和屬性。
DSL示例:
PUT /products
{
"mappings": {
"properties": {
"product_name": {
"type": "text",
"analyzer": "standard"
},
"description": {
"type": "text",
"analyzer": "english"
},
"price": {
"type": "float"
},
"category": {
"type": "keyword"
}
}
}
}Java示例:
CreateIndexRequest request = new CreateIndexRequest("products");
request.mapping("_doc",
"product_name", "type=text,analyzer=standard",
"description", "type=text,analyzer=english",
"price", "type=float",
"category", "type=keyword"
);
CreateIndexResponse createIndexResponse = client.indices()
.create(request, RequestOptions.DEFAULT);(二)刪除索引
刪除 Elasticsearch(ES)索引是一項(xiàng)重要的操作,可以用來清理不再需要的數(shù)據(jù)索引。要?jiǎng)h除 Elasticsearch 索引,可以使用以下常規(guī)DSL語句:
DELETE /my_index
在上述示例中,DELETE 是 HTTP 請(qǐng)求方法,/my_index 是要?jiǎng)h除的索引名稱。這個(gè)簡單的DSL語句會(huì)告訴 Elasticsearch 刪除名為 my_index 的索引及其所有數(shù)據(jù)。
DELETE:這是 HTTP 請(qǐng)求方法,指示 Elasticsearch 執(zhí)行刪除操作。/my_index:這是要?jiǎng)h除的索引的名稱。確保您提供的索引名稱是正確的,因?yàn)閯h除后無法恢復(fù)。
假設(shè)您運(yùn)營一個(gè)博客平臺(tái),以索引和存儲(chǔ)博客文章。有時(shí),您可能需要?jiǎng)h除某些舊的博客索引以釋放存儲(chǔ)空間。要?jiǎng)h除名為 blog_posts 的博客索引,可以使用以下DSL語句:
DELETE /blog_posts
對(duì)應(yīng)java代碼可以為:
DeleteIndexRequest deleteRequest = new DeleteIndexRequest("blog_posts");
AcknowledgedResponse deleteResponse = client.indices()
.delete(deleteRequest, RequestOptions.DEFAULT);
if (deleteResponse.isAcknowledged()) {
System.out.println("博客索引刪除成功");
} else {
System.out.println("博客索引刪除失敗");
}(三)關(guān)閉索引
關(guān)閉 Elasticsearch(ES)索引是一種操作,可以將索引設(shè)置為不可用狀態(tài),以減少資源消耗,但仍然保留索引定義和數(shù)據(jù)。要關(guān)閉 Elasticsearch 索引,可以使用以下常規(guī)DSL語句:
POST /my_index/_close
在上述示例中,POST 是 HTTP 請(qǐng)求方法,/my_index/_close 是要關(guān)閉的索引的路徑。這個(gè)DSL語句會(huì)告訴 Elasticsearch 關(guān)閉名為 my_index 的索引。
POST:這是 HTTP 請(qǐng)求方法,用于執(zhí)行關(guān)閉操作。/my_index/_close:這是要關(guān)閉的索引的路徑。請(qǐng)注意,關(guān)閉操作是通過向索引的特殊路徑發(fā)送 POST 請(qǐng)求來執(zhí)行的。
假設(shè)您運(yùn)營一個(gè)文檔管理系統(tǒng),使用 Elasticsearch 來存儲(chǔ)文檔索引。有時(shí),您可能需要關(guān)閉某個(gè)索引以釋放資源,但仍然保留索引定義,以便以后再次啟用。要關(guān)閉名為 document_index 的文檔索引,可以使用以下DSL語句:
POST /document_index/_close
對(duì)應(yīng)java代碼可寫為:
CloseIndexRequest closeIndexRequest = new CloseIndexRequest("document_index");
AcknowledgeResponse closeResponse = client.indices()
.close(closeIndexRequest, RequestOptions.DEFAULT);
if (closeResponse.isAcknowledged()) {
System.out.println("索引關(guān)閉成功");
} else {
System.out.println("索引關(guān)閉失敗");
}(四)打開索引
打開 Elasticsearch(ES)索引是一種操作,可以將先前關(guān)閉的索引重新設(shè)置為可用狀態(tài),以便進(jìn)行搜索和寫入操作。要打開 Elasticsearch 索引,可以使用以下常規(guī)DSL語句:
POST /my_index/_open
在上述示例中,POST 是 HTTP 請(qǐng)求方法,/my_index/_open 是要打開的索引的路徑。這個(gè)DSL語句會(huì)告訴 Elasticsearch 打開名為 my_index 的索引。
POST:這是 HTTP 請(qǐng)求方法,用于執(zhí)行打開操作。/my_index/_open:這是要打開的索引的路徑。請(qǐng)注意,打開操作是通過向索引的特殊路徑發(fā)送 POST 請(qǐng)求來執(zhí)行的。
假設(shè)您運(yùn)營一個(gè)文檔管理系統(tǒng),使用 Elasticsearch 存儲(chǔ)文檔索引。有時(shí),可能需要重新打開以前關(guān)閉的索引,以便用戶可以再次訪問和搜索文檔。要重新打開名為 document_index 的文檔索引,可以使用以下DSL語句:
POST /document_index/_open
對(duì)應(yīng)java代碼可寫為:
OpenIndexRequest openIndexRequest = new OpenIndexRequest("document_index");
OpenIndexResponse openResponse = client.indices()
.open(openIndexRequest, RequestOptions.DEFAULT);
if (openResponse.isAcknowledged()) {
System.out.println("索引打開成功");
} else {
System.out.println("索引打開失敗");
}這個(gè)示例適用于文檔管理系統(tǒng),如果先前關(guān)閉的文檔索引需要再次被用戶訪問和搜索,那么重新打開索引是一個(gè)有效的操作。這可以用于重新激活不再頻繁使用但仍然有價(jià)值的索引。
總之,重新打開 Elasticsearch 索引是一種管理索引可用性的操作,可用于恢復(fù)先前關(guān)閉的索引以進(jìn)行搜索和寫入操作。根據(jù)具體需求,可以使用DSL或 Elasticsearch 客戶端庫來執(zhí)行此操作。請(qǐng)注意,重新打開索引后,用戶可以再次對(duì)其執(zhí)行搜索和寫入操作。
(五)索引別名
Elasticsearch索引別名是一項(xiàng)強(qiáng)大的功能,用于管理索引的命名別稱,以提供更靈活的索引管理和查詢。
用法分析
- 索引版本控制:索引別名可以用于實(shí)現(xiàn)索引版本控制。當(dāng)您需要更新索引時(shí),可以創(chuàng)建一個(gè)新的索引,并將別名指向新索引,而不需要更改應(yīng)用程序中的查詢。這使得您可以平滑地進(jìn)行索引維護(hù)和升級(jí)。
- 切換索引:別名允許您在不中斷查詢的情況下切換索引。這對(duì)于在索引上執(zhí)行滾動(dòng)更新、備份、恢復(fù)和數(shù)據(jù)遷移等操作時(shí)非常有用。
- 多索引查詢:您可以將一個(gè)別名關(guān)聯(lián)到多個(gè)索引上,從而實(shí)現(xiàn)多索引查詢。這對(duì)于執(zhí)行跨多個(gè)索引的復(fù)雜查詢非常有用,而無需明確指定每個(gè)索引的名稱。
- 索引分割與歸檔:索引別名可以用于將數(shù)據(jù)分割到不同的索引中,以便更好地管理大量數(shù)據(jù)。例如,您可以創(chuàng)建每天一個(gè)新索引,然后使用別名匯總它們,之后可以輕松地歸檔或刪除舊的索引。
- 索引安全性:通過使用別名,您可以在后端更改實(shí)際索引名稱,從而增強(qiáng)索引的安全性。外部用戶不需要知道真正的索引名稱。
注意事項(xiàng)
- 別名不是索引:索引別名本身不存儲(chǔ)數(shù)據(jù),它只是一個(gè)指向一個(gè)或多個(gè)索引的符號(hào)引用。因此,創(chuàng)建和刪除別名是低成本的操作。
- 別名更改是原子操作:將別名切換到新索引或刪除別名是原子操作,這意味著它們不會(huì)中斷正在執(zhí)行的查詢。但請(qǐng)注意,將別名從一個(gè)索引切換到另一個(gè)索引后,新的索引可能需要時(shí)間來完全加載數(shù)據(jù)。
- 謹(jǐn)慎使用別名:雖然索引別名非常強(qiáng)大,但也需要謹(jǐn)慎使用。不恰當(dāng)?shù)膭e名管理可能會(huì)導(dǎo)致混淆和錯(cuò)誤。
- 版本控制的注意事項(xiàng):當(dāng)使用別名進(jìn)行索引版本控制時(shí),需要確保新索引的映射與舊索引的映射兼容。否則,應(yīng)用程序可能會(huì)出現(xiàn)問題。
- 查詢性能:盡管別名可以提高查詢的靈活性,但跨多個(gè)索引執(zhí)行查詢可能會(huì)增加性能開銷。請(qǐng)謹(jǐn)慎設(shè)計(jì)查詢以優(yōu)化性能。
總之,索引別名是 Elasticsearch 靈活索引管理的有力工具,但需要仔細(xì)規(guī)劃和使用。它們可以用于索引版本控制、查詢優(yōu)化和索引維護(hù),但需要謹(jǐn)慎管理以確保正確性和性能。
應(yīng)用案例舉例和具體案例展示
案例舉例-版本控制:
- 案例:假設(shè)您的應(yīng)用程序存儲(chǔ)用戶生成的文檔,并且您需要定期更新文檔結(jié)構(gòu),例如添加新字段或更改映射。同時(shí),您希望用戶可以持續(xù)訪問其舊文檔,并逐漸遷移到新文檔結(jié)構(gòu)。
- 解決方案:您可以為每個(gè)文檔類型創(chuàng)建一個(gè)別名,例如"v1"和"v2",每個(gè)別名指向不同版本的索引。當(dāng)您需要更新索引時(shí),創(chuàng)建一個(gè)新的索引版本,并將別名指向新索引。這樣,新文檔將被寫入新索引,而用戶仍然可以查詢舊索引以訪問舊文檔。逐漸遷移用戶到新索引后,您可以刪除舊索引。
案例舉例-多索引查詢:
- 案例:您的應(yīng)用程序需要執(zhí)行復(fù)雜的查詢,涉及多個(gè)索引。例如,在電子商務(wù)平臺(tái)上,您可能有一個(gè)索引用于存儲(chǔ)產(chǎn)品信息,另一個(gè)用于存儲(chǔ)訂單信息,而查詢需要同時(shí)涵蓋這兩個(gè)索引。
- 解決方案:創(chuàng)建一個(gè)別名,例如"ecommerce_data",將其指向產(chǎn)品和訂單索引。然后,您的查詢可以針對(duì)"ecommerce_data"別名執(zhí)行,而無需明確指定每個(gè)索引的名稱。這使得查詢更簡單且更具可維護(hù)性。
案例舉例-索引分割與歸檔:
- 案例:您的應(yīng)用程序需要存儲(chǔ)大量數(shù)據(jù),例如日志數(shù)據(jù),但不希望將所有數(shù)據(jù)存儲(chǔ)在一個(gè)巨大的索引中。您還希望能夠輕松地歸檔舊數(shù)據(jù),同時(shí)保持查詢的可用性。
- 解決方案:創(chuàng)建一個(gè)別名,例如"logs",將其指向每天一個(gè)新索引。每天結(jié)束時(shí),創(chuàng)建新索引并更新別名,這樣新數(shù)據(jù)將被寫入新索引。舊索引可以被歸檔或刪除,而查詢可以繼續(xù)使用"logs"別名,無需更改。
案例舉例索引切換:
- 案例:您的應(yīng)用程序需要進(jìn)行滾動(dòng)更新,例如,將新版本的數(shù)據(jù)引入到生產(chǎn)環(huán)境中,同時(shí)確保零停機(jī)時(shí)間。
- 解決方案:創(chuàng)建一個(gè)別名,例如"live_data",將其指向當(dāng)前的生產(chǎn)索引。然后,將新索引準(zhǔn)備好,并在準(zhǔn)備就緒后,將別名從舊索引切換到新索引。這樣,新數(shù)據(jù)將在不中斷查詢的情況下引入到生產(chǎn)環(huán)境中。
這些案例說明了索引別名在處理數(shù)據(jù)版本控制、查詢優(yōu)化、數(shù)據(jù)分割與歸檔以及索引切換方面的實(shí)際應(yīng)用。通過巧妙使用別名,可以更靈活地管理和操作您的 Elasticsearch 索引,同時(shí)確保數(shù)據(jù)的可用性和性能。
選擇上面提到的 "版本控制" 案例,并進(jìn)行具體的展示和分析步驟。這個(gè)案例涉及使用索引別名進(jìn)行索引版本控制,允許平滑地更新索引結(jié)構(gòu)而不中斷用戶查詢。
背景:假設(shè)我們運(yùn)營一個(gè)博客平臺(tái),使用 Elasticsearch 來存儲(chǔ)博客文章。需要定期更新博客文章的結(jié)構(gòu),例如,添加新字段或更改映射。同時(shí)希望用戶可以持續(xù)訪問其舊的博客文章,并逐漸遷移到新的文章結(jié)構(gòu)。
第一步:創(chuàng)建初始索引和別名
創(chuàng)建初始的博客索引,例如 blog_posts_v1。
PUT /blog_posts_v1
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"date_published": {
"type": "date"
}
}
}
}
創(chuàng)建一個(gè)別名 blog_posts,將其指向初始的博客索引。
POST /_aliases
{
"actions": [
{
"add": {
"index": "blog_posts_v1",
"alias": "blog_posts"
}
}
]
}
第二步:定期更新索引結(jié)構(gòu)。當(dāng)需要更新索引結(jié)構(gòu)時(shí),創(chuàng)建一個(gè)新的博客索引,例如 blog_posts_v2,并更新映射。
PUT /blog_posts_v2
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"date_published": {
"type": "date"
},
"author": {
"type": "keyword"
}
}
}
}
第三步:切換別名。一旦新的博客索引 blog_posts_v2 準(zhǔn)備就緒,使用別名切換將別名 blog_posts 從舊索引 blog_posts_v1 切換到新索引 blog_posts_v2。
POST /_aliases
{
"actions": [
{
"remove": {
"index": "blog_posts_v1",
"alias": "blog_posts"
}
},
{
"add": {
"index": "blog_posts_v2",
"alias": "blog_posts"
}
}
]
}
第四步:用戶遷移。用戶可以繼續(xù)訪問和查詢博客文章,而無需更改他們的查詢代碼。新的博客文章將寫入新的索引 blog_posts_v2,而舊的博客文章仍然可查詢。
第五步:清理舊索引。定期清理舊的博客索引(例如,blog_posts_v1),或者在不再需要它們時(shí)進(jìn)行歸檔或刪除。
這個(gè)案例說明了如何使用索引別名在更新索引結(jié)構(gòu)時(shí),平滑地遷移用戶到新的索引版本,同時(shí)保持查詢的連續(xù)性。索引別名是實(shí)現(xiàn)版本控制和索引維護(hù)的有力工具。
二、映射操作
在 Elasticsearch 中,映射(Mapping)是用來定義如何存儲(chǔ)和索引文檔中字段的方式的重要概念。映射操作用于指定字段的數(shù)據(jù)類型、分析器以及其他屬性,以便 Elasticsearch 能夠正確地處理和查詢文檔中的數(shù)據(jù)。
映射是 Elasticsearch 中的元數(shù)據(jù),它描述了索引中每個(gè)字段的數(shù)據(jù)類型、如何被索引以及如何存儲(chǔ)。它允許 Elasticsearch 理解和處理文檔中的數(shù)據(jù)。
映射的主要元素:
- 數(shù)據(jù)類型:定義字段的數(shù)據(jù)類型,如文本、數(shù)字、日期、地理位置等。
- 分析器(Analyzer):指定用于分詞和處理文本字段的分析器。分析器將文本字段拆分成單詞,以便進(jìn)行全文搜索。
- 屬性(Properties):定義字段的其他屬性,如是否可搜索、是否存儲(chǔ)原始值、是否支持排序等。
- 嵌套映射(Nested Mapping):用于處理復(fù)雜數(shù)據(jù)結(jié)構(gòu),如嵌套文檔或數(shù)組。
映射對(duì)于正確索引和查詢文檔非常重要。如果映射不正確,將導(dǎo)致搜索和分析錯(cuò)誤。正確的映射可以優(yōu)化查詢性能,使 Elasticsearch 能夠更好地理解和處理文檔數(shù)據(jù)。一旦索引創(chuàng)建后,通常不能直接更改映射。但可以通過重新索引數(shù)據(jù)或創(chuàng)建新索引來應(yīng)用新的映射。
映射的注意事項(xiàng):
- 映射的設(shè)計(jì)需要仔細(xì)考慮,因?yàn)椴徽_的映射可能會(huì)導(dǎo)致數(shù)據(jù)不一致或搜索性能下降。
- 映射更改可能需要謹(jǐn)慎處理,特別是在生產(chǎn)環(huán)境中,因?yàn)椴徽_的映射更改可能會(huì)導(dǎo)致數(shù)據(jù)丟失或不可用。
總之,映射是 Elasticsearch 中用于定義和管理索引字段的關(guān)鍵操作。正確的映射設(shè)計(jì)可以提高查詢性能和數(shù)據(jù)質(zhì)量,而不正確的映射可能會(huì)導(dǎo)致問題。在設(shè)計(jì)和管理索引時(shí),請(qǐng)謹(jǐn)慎考慮映射的使用和更改。
(一)查看映射
在 Elasticsearch 中,可以使用映射操作查看索引的映射信息。要查看索引的映射,可以使用以下常規(guī)DSL語句:
GET /my_index/_mapping
在上述示例中,GET 是 HTTP 請(qǐng)求方法,/my_index/_mapping 是要查看映射的索引名稱。
GET:這是 HTTP 請(qǐng)求方法,用于執(zhí)行查看映射操作。/my_index/_mapping:這是要查看映射的索引的路徑。
假設(shè)運(yùn)營一個(gè)電子商務(wù)網(wǎng)站,使用 Elasticsearch 來存儲(chǔ)產(chǎn)品信息。電子商務(wù)網(wǎng)站存儲(chǔ)產(chǎn)品信息的 Elasticsearch 索引名為 products,該索引包含產(chǎn)品的名稱、價(jià)格、描述等信息。使用以下DSL語句來查看產(chǎn)品索引 products 的映射:
GET /products/_mapping
使用以下DSL請(qǐng)求 GET /products/_mapping 會(huì)返回關(guān)于索引 products 的映射信息。返回結(jié)果將是一個(gè)JSON格式的響應(yīng),其中包含有關(guān)索引中字段的詳細(xì)信息。以下是對(duì)返回結(jié)果的分析說明:
{
"products": {
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"price": {
"type": "float"
},
"description": {
"type": "text"
},
// 其他字段...
}
}
}
}
(二)擴(kuò)展映射
在 Elasticsearch 中,擴(kuò)展映射(Mapping Expansion)是一項(xiàng)操作,用于在已有的索引映射基礎(chǔ)上添加新的字段或修改已有字段的屬性。這可以用于動(dòng)態(tài)地適應(yīng)數(shù)據(jù)模型的變化或?yàn)樗饕械淖侄翁砑有鹿δ?。以下是有關(guān)擴(kuò)展映射的分析:
擴(kuò)展映射的使用場景
- 適應(yīng)數(shù)據(jù)模型的變化:當(dāng)應(yīng)用程序需要存儲(chǔ)新類型的數(shù)據(jù)或更改現(xiàn)有數(shù)據(jù)的結(jié)構(gòu)時(shí),擴(kuò)展映射是一種靈活的方式。例如,可以將新的文本字段添加到索引,以存儲(chǔ)新類型的信息。
- 引入新的數(shù)據(jù)屬性:可能需要在索引中添加新的字段來存儲(chǔ)與現(xiàn)有數(shù)據(jù)相關(guān)的新屬性。例如,如果索引包含產(chǎn)品信息,可能希望在以后添加字段來存儲(chǔ)產(chǎn)品的新特性。
- 索引迭代和升級(jí):當(dāng)需要對(duì)索引進(jìn)行迭代和升級(jí)時(shí),擴(kuò)展映射是必要的。例如,如果在舊版本的索引中不包括某些字段,但在新版本中需要這些字段,可以擴(kuò)展映射以包括這些字段。
擴(kuò)展映射的操作步驟
- 創(chuàng)建新映射:首先,需要定義新字段的映射。這包括指定字段的數(shù)據(jù)類型、分析器和其他屬性。可以通過創(chuàng)建一個(gè)新的索引映射來完成。
- 將新映射添加到索引:一旦新映射定義好了,可以使用索引別名或新的索引名稱,將新映射添加到索引中。
- 重新索引數(shù)據(jù):如果新映射需要應(yīng)用于已有的數(shù)據(jù),需要重新索引現(xiàn)有數(shù)據(jù)以適應(yīng)新的映射。這可以通過重新索引工具或 Elasticsearch 的 Reindex API 來實(shí)現(xiàn)。
- 測試和驗(yàn)證:在應(yīng)用新映射之前,建議對(duì)其進(jìn)行測試和驗(yàn)證,以確保數(shù)據(jù)存儲(chǔ)和查詢操作按預(yù)期工作。
注意事項(xiàng)和考慮因素
- 擴(kuò)展映射可能需要一些索引維護(hù)工作,特別是對(duì)于大型索引。重新索引數(shù)據(jù)可能會(huì)導(dǎo)致一些性能開銷。
- 在擴(kuò)展映射時(shí),確保新映射的定義與應(yīng)用程序的需求和數(shù)據(jù)模型一致。
- 考慮數(shù)據(jù)遷移策略,特別是在高可用性和生產(chǎn)環(huán)境中。數(shù)據(jù)遷移應(yīng)謹(jǐn)慎進(jìn)行,以確保不會(huì)導(dǎo)致數(shù)據(jù)丟失或中斷查詢。
總之,擴(kuò)展映射是 Elasticsearch 中用于適應(yīng)數(shù)據(jù)模型變化和引入新屬性的重要操作。它提供了靈活性,允許根據(jù)應(yīng)用程序需求不斷發(fā)展和擴(kuò)展索引映射。在執(zhí)行擴(kuò)展映射操作時(shí),請(qǐng)謹(jǐn)慎規(guī)劃和測試,以確保數(shù)據(jù)的完整性和性能。
業(yè)務(wù)舉例:擴(kuò)展映射以添加作者和標(biāo)簽字段
假設(shè)運(yùn)營一個(gè)在線新聞門戶網(wǎng)站,使用 Elasticsearch 來存儲(chǔ)新聞文章的索引。最初的索引只包含文章的標(biāo)題、內(nèi)容和發(fā)布日期?,F(xiàn)在,我們決定擴(kuò)展映射,以添加新的字段以存儲(chǔ)文章的作者和標(biāo)簽。新聞門戶網(wǎng)站使用 Elasticsearch 索引 news_articles 來存儲(chǔ)新聞文章。最初的映射定義如下:
{
"news_articles": {
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"publish_date": {
"type": "date"
}
}
}
}
}
現(xiàn)在,決定擴(kuò)展映射,以包括文章的作者和標(biāo)簽信息。
第一步:創(chuàng)建新映射。需要?jiǎng)?chuàng)建新的映射,以包括作者和標(biāo)簽字段。新映射如下所示:
{
"news_articles": {
"mappings": {
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"publish_date": {
"type": "date"
},
"author": {
"type": "text"
},
"tags": {
"type": "keyword"
}
}
}
}
}在新映射中,我們添加了兩個(gè)新字段:author 和 tags,分別用于存儲(chǔ)文章的作者名字和標(biāo)簽(以關(guān)鍵字類型存儲(chǔ))。
第二步:將新映射添加到索引。為了將新映射添加到現(xiàn)有索引中,可以執(zhí)行以下步驟:
- 創(chuàng)建一個(gè)新的索引,例如
news_articles_v2,并應(yīng)用新的映射。 - 使用 Elasticsearch 的 Reindex API 將現(xiàn)有索引中的數(shù)據(jù)重新索引到新索引中。在此過程中,新映射將被應(yīng)用于已有的數(shù)據(jù)。
- 更新索引別名,以使別名指向新的索引,使其成為主要的查詢目標(biāo)。
第三步:測試和驗(yàn)證。在應(yīng)用新映射之前,進(jìn)行測試和驗(yàn)證以確保查詢和索引操作按預(yù)期工作。確保新字段的數(shù)據(jù)存儲(chǔ)和檢索都正確無誤。
(三)基本的數(shù)據(jù)類型
keyword類型
在 Elasticsearch 映射操作中,keyword 類型是一種常用的基本數(shù)據(jù)類型,用于存儲(chǔ)關(guān)鍵字?jǐn)?shù)據(jù)。與 text 類型不同,keyword 類型不進(jìn)行分詞,它將整個(gè)文本視為單個(gè)詞條。這使得 keyword 類型非常適合用于排序、聚合和精確匹配等操作。
- 關(guān)鍵字?jǐn)?shù)據(jù):
keyword類型用于存儲(chǔ)不需要分詞的關(guān)鍵字?jǐn)?shù)據(jù)。這包括標(biāo)簽、標(biāo)識(shí)符、名稱、狀態(tài)等文本信息,通常需要進(jìn)行精確匹配或按照字母順序排序。 - 不分詞:與
text類型不同,keyword類型不會(huì)對(duì)文本進(jìn)行分詞。它將整個(gè)文本視為單個(gè)詞條,保留原始文本的完整性。 - 精確匹配和排序:由于不進(jìn)行分詞,
keyword類型非常適合進(jìn)行精確匹配(例如,過濾和篩選操作)和排序操作。您可以確保查詢的精確匹配,而不受分詞的影響,同時(shí)還可以按照字母順序?qū)?shù)據(jù)進(jìn)行排序。 - 不適用于全文搜索:由于不進(jìn)行分詞,
keyword類型不適用于全文搜索。如果需要全文搜索,通常應(yīng)使用text類型。
假設(shè)您正在使用 Elasticsearch 存儲(chǔ)產(chǎn)品信息,并且每個(gè)產(chǎn)品都有一個(gè)標(biāo)簽列表,希望能夠按照標(biāo)簽進(jìn)行精確匹配和排序。
創(chuàng)建一個(gè)索引映射,包括一個(gè) keyword 類型的字段來存儲(chǔ)產(chǎn)品標(biāo)簽。
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"tags": {
"type": "keyword"
}
}
}
}
向索引中添加一些產(chǎn)品文檔,包括標(biāo)簽信息。
POST /products/_doc/1
{
"name": "Product A",
"tags": ["electronics", "smartphone"]
}
POST /products/_doc/2
{
"name": "Product B",
"tags": ["clothing", "shoes"]
}
執(zhí)行一個(gè)精確匹配的查詢,查找包含特定標(biāo)簽的產(chǎn)品。
GET /products/_search
{
"query": {
"match": {
"tags": "electronics"
}
}
}
此查詢將返回包含 "electronics" 標(biāo)簽的產(chǎn)品,而不會(huì)返回包含 "smartphone" 標(biāo)簽的產(chǎn)品。
執(zhí)行一個(gè)排序查詢,按標(biāo)簽字段的字母順序?qū)Ξa(chǎn)品進(jìn)行排序。
GET /products/_search
{
"sort": [
{
"tags": "asc"
}
]
}
此查詢將返回產(chǎn)品按標(biāo)簽字段的字母順序升序排列。
通過使用 keyword 類型來存儲(chǔ)標(biāo)簽信息,可以輕松地進(jìn)行精確匹配和排序,同時(shí)保留了標(biāo)簽的原始完整性。這在許多應(yīng)用中非常有用,特別是在需要處理結(jié)構(gòu)化數(shù)據(jù)的情況下。
text類型
在 Elasticsearch 映射操作中,text 類型是一種常用的基本數(shù)據(jù)類型,用于存儲(chǔ)文本數(shù)據(jù),通常用于全文搜索和分析。
- 文本數(shù)據(jù):
text類型主要用于存儲(chǔ)文本數(shù)據(jù),例如文章內(nèi)容、產(chǎn)品描述、評(píng)論等。這些字段通常需要進(jìn)行全文搜索和分析。 - 分詞:
text類型會(huì)對(duì)文本進(jìn)行分詞,將文本拆分成單詞或詞條,以便更好地支持全文搜索和分析。分詞可以根據(jù)配置的分析器進(jìn)行,以便處理不同語言和文本特性。 - 全文搜索:由于分詞的支持,
text類型非常適合進(jìn)行全文搜索操作。它允許用戶查詢包含特定單詞或短語的文檔,而不需要精確匹配整個(gè)字段內(nèi)容。 - 分析功能:
text類型還支持分析功能,包括在搜索時(shí)執(zhí)行文本預(yù)處理(如小寫化、去停用詞、詞干提取等)以及相關(guān)性評(píng)分。
假設(shè)正在使用 Elasticsearch 存儲(chǔ)產(chǎn)品評(píng)論,希望能夠搜索和分析評(píng)論內(nèi)容。創(chuàng)建一個(gè)索引映射,包括一個(gè) text 類型的字段來存儲(chǔ)評(píng)論內(nèi)容。
PUT /product_reviews
{
"mappings": {
"properties": {
"product_name": {
"type": "keyword"
},
"comment": {
"type": "text"
}
}
}
}
向索引中添加一些產(chǎn)品評(píng)論文檔。
POST /product_reviews/_doc/1
{
"product_name": "Product A",
"comment": "This product is amazing! I love it."
}
POST /product_reviews/_doc/2
{
"product_name": "Product B",
"comment": "Not satisfied with this product. It doesn't meet my expectations."
}
執(zhí)行一個(gè)全文搜索的查詢,查找包含特定關(guān)鍵字的評(píng)論。
GET /product_reviews/_search
{
"query": {
"match": {
"comment": "amazing"
}
}
}
此查詢將返回包含 "amazing" 關(guān)鍵字的評(píng)論。
執(zhí)行一個(gè)分析查詢,使用分析功能評(píng)分。
GET /product_reviews/_search
{
"query": {
"match_phrase": {
"comment": "product satisfaction"
}
},
"sort": [
"_score" // 根據(jù)相關(guān)性評(píng)分排序
]
}
此查詢將返回包含 "product satisfaction" 短語的評(píng)論,并且可以根據(jù)相關(guān)性進(jìn)行排序。
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.2345678, // 最高評(píng)分
"hits": [
{
"_index": "product_reviews",
"_type": "_doc",
"_id": "3",
"_score": 1.2345678, // 文檔的評(píng)分
"_source": {
"product_name": "Product C",
"comment": "I have found great product satisfaction with this item."
}
},
{
"_index": "product_reviews",
"_type": "_doc",
"_id": "4",
"_score": 0.9876543, // 文檔的評(píng)分
"_source": {
"product_name": "Product D",
"comment": "Product satisfaction is important for me."
}
}
]
}
}
通過使用 text 類型來存儲(chǔ)評(píng)論內(nèi)容,可以進(jìn)行全文搜索和分析,以更好地理解用戶的反饋和需求。這對(duì)于處理文本數(shù)據(jù)的應(yīng)用場景非常有用,例如產(chǎn)品評(píng)論、新聞文章、博客內(nèi)容等。
數(shù)值類型
在 Elasticsearch 映射操作中,數(shù)值類型用于存儲(chǔ)數(shù)值數(shù)據(jù),這些數(shù)據(jù)通常包括整數(shù)和浮點(diǎn)數(shù)。數(shù)值類型非常適用于執(zhí)行范圍查詢、聚合操作和數(shù)值計(jì)算。主要數(shù)值類型如下:
integer:用于存儲(chǔ)整數(shù)值。適用于存儲(chǔ)沒有小數(shù)部分的整數(shù)。
long:用于存儲(chǔ)長整數(shù)值。通常用于存儲(chǔ)較大范圍的整數(shù)。
float:用于存儲(chǔ)單精度浮點(diǎn)數(shù)值。
double:用于存儲(chǔ)雙精度浮點(diǎn)數(shù)值。通常用于存儲(chǔ)高精度的浮點(diǎn)數(shù)。
這些數(shù)值類型用于存儲(chǔ)不同范圍和精度的數(shù)值數(shù)據(jù),以支持各種數(shù)值計(jì)算和分析需求。
假設(shè)正在使用 Elasticsearch 存儲(chǔ)銷售數(shù)據(jù),其中包括產(chǎn)品的價(jià)格(浮點(diǎn)數(shù))和銷售數(shù)量(整數(shù))。創(chuàng)建一個(gè)名為 "sales" 的索引,其中包括了價(jià)格(price)和銷售數(shù)量(quantity)字段:
PUT /sales
{
"mappings": {
"properties": {
"price": {
"type": "float"
},
"quantity": {
"type": "integer"
}
}
}
}
插入了兩個(gè)產(chǎn)品的銷售數(shù)據(jù):
POST /sales/_doc/1
{
"price": 75.99,
"quantity": 15
}
POST /sales/_doc/2
{
"price": 95.50,
"quantity": 20
}
假設(shè)希望查找價(jià)格在 50 到 100 之間且銷售數(shù)量大于等于 10 的產(chǎn)品。
GET /sales/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
},
{
"range": {
"quantity": {
"gte": 10
}
}
}
]
}
}
}
返回結(jié)果將包含與查詢條件匹配的文檔。
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "sales",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"product_name": "Product A",
"price": 75.99,
"quantity": 15
}
},
{
"_index": "sales",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"product_name": "Product B",
"price": 95.50,
"quantity": 20
}
}
]
}
}
分析說明:
- 查詢使用了
range查詢來查找價(jià)格在 50 到 100 之間的產(chǎn)品,以及銷售數(shù)量大于等于 10 的產(chǎn)品。 - 返回結(jié)果包含了匹配的文檔,每個(gè)文檔都包括了相關(guān)信息和相關(guān)性評(píng)分。
- 查詢結(jié)果中包括兩個(gè)產(chǎn)品,它們的價(jià)格和銷售數(shù)量滿足查詢條件。
這個(gè)示例演示了如何使用數(shù)值類型進(jìn)行范圍查詢,以查找滿足特定條件的文檔。數(shù)值類型非常適用于存儲(chǔ)和查詢數(shù)值數(shù)據(jù),對(duì)于分析、統(tǒng)計(jì)和報(bào)告等用途非常有用。
布爾類型
在 Elasticsearch 映射操作中,布爾類型(Boolean)是一種基本的數(shù)據(jù)類型,用于存儲(chǔ)布爾值,即 true 或 false。布爾類型通常用于存儲(chǔ)表示真假條件的信息,例如是否已完成、是否可用等。
- 布爾數(shù)據(jù):布爾類型用于存儲(chǔ)布爾值,它們表示真假條件。在 Elasticsearch 中,布爾字段可以用于標(biāo)識(shí)文檔是否滿足某些條件。
- 存儲(chǔ)效率:布爾字段非常節(jié)省存儲(chǔ)空間,因?yàn)樗鼈冎恍枰粋€(gè)位來表示 true 或 false。這對(duì)于存儲(chǔ)大量布爾信息的索引非常有用。
- 查詢和過濾:布爾字段可用于執(zhí)行查詢和過濾操作??梢愿鶕?jù)布爾字段的值來篩選文檔,例如查找所有已完成的任務(wù)或所有可用的產(chǎn)品。
假設(shè)正在使用 Elasticsearch 存儲(chǔ)任務(wù)列表,并希望標(biāo)識(shí)哪些任務(wù)已完成(true)和哪些任務(wù)未完成(false)。使用 PUT 請(qǐng)求創(chuàng)建一個(gè)索引(index),并指定索引映射(mapping)。在此示例中,我們創(chuàng)建一個(gè)名為 "tasks" 的索引,并定義了兩個(gè)字段:任務(wù)名稱(task_name)和是否已完成(is_completed)。
PUT /tasks
{
"mappings": {
"properties": {
"task_name": {
"type": "text"
},
"is_completed": {
"type": "boolean"
}
}
}
}
插入一些示例任務(wù)數(shù)據(jù)的請(qǐng)求:
POST /tasks/_doc/1
{
"task_name": "Task A",
"is_completed": true
}
POST /tasks/_doc/2
{
"task_name": "Task B",
"is_completed": false
}
POST /tasks/_doc/3
{
"task_name": "Task C",
"is_completed": true
}
假設(shè)要查詢所有已完成的任務(wù):
GET /tasks/_search
{
"query": {
"term": {
"is_completed": true
}
}
}
返回結(jié)果將包含已完成的任務(wù)文檔:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "tasks",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"task_name": "Task A",
"is_completed": true
}
},
{
"_index": "tasks",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"task_name": "Task C",
"is_completed": true
}
}
]
}
}
- 查詢使用了
term查詢來查找is_completed字段為true的任務(wù)。 - 返回結(jié)果包含了已完成的任務(wù)文檔,每個(gè)文檔都包括了相關(guān)信息和相關(guān)性評(píng)分(如果使用相關(guān)性評(píng)分)。
這個(gè)示例演示了如何使用布爾類型字段來標(biāo)識(shí)和查詢已完成的任務(wù)。布爾類型在存儲(chǔ)和查詢表示真假條件的信息時(shí)非常有用,例如任務(wù)狀態(tài)、商品可用性等。通過這種方式,可以有效地管理和查詢布爾值數(shù)據(jù)。
日期類型
在 Elasticsearch 映射操作中,日期類型(Date)是一種基本的數(shù)據(jù)類型,用于存儲(chǔ)日期和時(shí)間信息。日期類型通常用于記錄事件發(fā)生的時(shí)間戳或日期值。
- 日期時(shí)間數(shù)據(jù):日期類型用于存儲(chǔ)日期和時(shí)間信息,通常表示為 ISO 8601 格式的日期字符串(例如:"2023-10-06T15:30:00Z")。
- 存儲(chǔ)格式:Elasticsearch 內(nèi)部將日期類型存儲(chǔ)為 UNIX 時(shí)間戳(以毫秒為單位),但可以在查詢和返回結(jié)果中使用更人類可讀的日期字符串。
- 支持的日期格式:Elasticsearch 支持多種日期格式的解析,允許索引不同格式的日期,并在查詢時(shí)執(zhí)行日期范圍過濾和聚合。
- 時(shí)區(qū)處理:日期類型支持時(shí)區(qū)信息,以確保正確處理不同時(shí)區(qū)的日期和時(shí)間。
假設(shè)您正在使用 Elasticsearch 存儲(chǔ)新聞文章,并希望記錄每篇文章的發(fā)布日期。使用 PUT 請(qǐng)求創(chuàng)建一個(gè)索引(index),并指定索引映射(mapping)。在此示例中,我們創(chuàng)建一個(gè)名為 "news_articles" 的索引,并定義了兩個(gè)字段:新聞標(biāo)題(headline)和發(fā)布日期(publish_date)。
PUT /news_articles
{
"mappings": {
"properties": {
"headline": {
"type": "text"
},
"publish_date": {
"type": "date"
}
}
}
}
插入一些示例新聞文章數(shù)據(jù)的請(qǐng)求:
POST /news_articles/_doc/1
{
"headline": "Elasticsearch 8.0 Released",
"publish_date": "2023-04-15T10:30:00Z"
}
POST /news_articles/_doc/2
{
"headline": "Big Data Summit 2023 Recap",
"publish_date": "2023-07-20T14:45:00Z"
}
POST /news_articles/_doc/3
{
"headline": "AI Advances in Healthcare",
"publish_date": "2023-11-10T08:15:00Z"
}
假設(shè)您要查詢所有發(fā)布日期在特定時(shí)間段內(nèi)的文章:
GET /news_articles/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2023-01-01T00:00:00Z",
"lte": "2023-12-31T23:59:59Z"
}
}
}
}
返回結(jié)果將包含發(fā)布日期在指定時(shí)間段內(nèi)的文章:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "news_articles",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"headline": "Article A",
"publish_date": "2023-04-15T10:30:00Z"
}
},
{
"_index": "news_articles",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"headline": "Article B",
"publish_date": "2023-07-20T14:45:00Z"
}
},
{
"_index": "news_articles",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"headline": "Article C",
"publish_date": "2023-11-10T08:15:00Z"
}
}
]
}
}
- 查詢使用了
range查詢來查找發(fā)布日期在 2023 年內(nèi)的文章。 - 返回結(jié)果包含了發(fā)布日期在指定時(shí)間段內(nèi)的文章,每個(gè)文檔都包括了相關(guān)信息和相關(guān)性評(píng)分(如果使用相關(guān)性評(píng)分)。
這個(gè)示例演示了如何使用日期類型字段來存儲(chǔ)和查詢?nèi)掌谛畔?。日期類型在存?chǔ)和分析與時(shí)間相關(guān)的數(shù)據(jù)時(shí)非常有用,例如新聞發(fā)布日期、事件發(fā)生時(shí)間等。通過這種方式,可以輕松地執(zhí)行日期范圍過濾和聚合操作,以滿足各種時(shí)間相關(guān)的查詢需求。
(四)復(fù)雜數(shù)據(jù)類型
數(shù)組類型
在 Elasticsearch 映射操作中,數(shù)組類型用于存儲(chǔ)多個(gè)值的集合,這些值可以是相同類型的,也可以是不同類型的。數(shù)組類型通常用于表示復(fù)雜的多值字段,例如標(biāo)簽、評(píng)論、作者列表等。
- 數(shù)組數(shù)據(jù):數(shù)組類型允許在單個(gè)字段中存儲(chǔ)多個(gè)值,這些值可以是文本、數(shù)字、日期或其他數(shù)據(jù)類型。
- 多值字段:與傳統(tǒng)數(shù)據(jù)庫不同,Elasticsearch 允許字段具有多個(gè)值,而不需要?jiǎng)?chuàng)建多個(gè)字段。這使得數(shù)組類型非常適用于存儲(chǔ)多值屬性。
- 支持的數(shù)據(jù)類型:數(shù)組可以包含不同類型的數(shù)據(jù),例如文本、數(shù)字、日期等。這使得它非常靈活。
- 查詢和過濾:可以使用數(shù)組字段執(zhí)行查詢和過濾操作,例如查找包含特定值的文檔或在數(shù)組中查找范圍內(nèi)的值。
假設(shè)您正在使用 Elasticsearch 存儲(chǔ)圖書信息,每本書可以有多個(gè)作者。使用 PUT 請(qǐng)求創(chuàng)建一個(gè)索引(index),并指定索引映射(mapping)。在此示例中,我們創(chuàng)建一個(gè)名為 "books" 的索引,并定義了兩個(gè)字段:書名(title)和作者列表(authors)。
PUT /books
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"authors": {
"type": "keyword"
}
}
}
}
插入一些示例圖書數(shù)據(jù)的請(qǐng)求:
POST /books/_doc/1
{
"title": "Book A",
"authors": ["John Smith", "Alice Johnson"]
}
POST /books/_doc/2
{
"title": "Book B",
"authors": ["John Smith", "David Williams"]
}
POST /books/_doc/3
{
"title": "Book C",
"authors": ["Alice Johnson", "Emily Davis"]
}
假設(shè)要查詢包含作者 "John Smith" 的書籍:
GET /books/_search
{
"query": {
"match": {
"authors": "John Smith"
}
}
}
返回結(jié)果將包含包含 "John Smith" 作為作者的書籍:
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "books",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "Book A",
"authors": ["John Smith", "Alice Johnson"]
}
},
{
"_index": "books",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"title": "Book B",
"authors": ["John Smith", "David Williams"]
}
}
]
}
}
- 查詢使用了
match查詢來查找包含作者 "John Smith" 的書籍。 - 返回結(jié)果包含了滿足查詢條件的書籍文檔,每個(gè)文檔都包括了相關(guān)信息和相關(guān)性評(píng)分(如果使用相關(guān)性評(píng)分)。
這個(gè)示例演示了如何使用數(shù)組類型字段來存儲(chǔ)和查詢多個(gè)值的集合。數(shù)組類型非常適用于表示多值屬性,例如多個(gè)作者、標(biāo)簽或評(píng)論。通過這種方式,可以輕松地查詢包含特定值的文檔,以滿足各種多值屬性的查詢需求。
對(duì)象類型
在 Elasticsearch 映射操作中,對(duì)象類型(Object)是一種復(fù)雜的數(shù)據(jù)類型,用于存儲(chǔ)嵌套的結(jié)構(gòu)化數(shù)據(jù)。對(duì)象類型允許將多個(gè)字段組合到一個(gè)單獨(dú)的對(duì)象中,這些字段可以是不同類型的,形成了文檔內(nèi)的嵌套結(jié)構(gòu)。
- 對(duì)象數(shù)據(jù):對(duì)象類型用于存儲(chǔ)嵌套的結(jié)構(gòu)化數(shù)據(jù)。它允許將多個(gè)字段組織為一個(gè)單獨(dú)的對(duì)象,以便更好地表示數(shù)據(jù)的層次性和復(fù)雜性。
- 嵌套字段:對(duì)象字段中的每個(gè)子字段都可以有自己的數(shù)據(jù)類型。這允許在一個(gè)文檔中存儲(chǔ)多個(gè)嵌套字段,每個(gè)字段可以有不同的數(shù)據(jù)類型,例如文本、數(shù)字、日期等。
- 結(jié)構(gòu)化數(shù)據(jù):對(duì)象類型特別適用于存儲(chǔ)具有層次結(jié)構(gòu)的數(shù)據(jù),例如產(chǎn)品包含屬性、訂單包含多個(gè)項(xiàng)目等。
- 查詢和過濾:可以使用對(duì)象類型執(zhí)行查詢和過濾操作,以訪問和操作嵌套的數(shù)據(jù)。
假設(shè)您正在使用 Elasticsearch 存儲(chǔ)個(gè)人信息,其中每個(gè)文檔表示一個(gè)人,包括姓名(name)、地址(address)、聯(lián)系信息(contact)等。
PUT /people
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "object",
"properties": {
"city": {
"type": "text"
},
"state": {
"type": "keyword"
}
}
},
"contact": {
"type": "object",
"properties": {
"email": {
"type": "text"
},
"phone": {
"type": "text"
}
}
}
}
}
}
插入一些示例數(shù)據(jù)的請(qǐng)求:
POST /people/_doc/1
{
"name": "Alice Johnson",
"address": {
"city": "New York",
"state": "NY"
},
"contact": {
"email": "alice@example.com",
"phone": "555-1234"
}
}
POST /people/_doc/2
{
"name": "Bob Smith",
"address": {
"city": "Los Angeles",
"state": "CA"
},
"contact": {
"email": "bob@example.com",
"phone": "555-5678"
}
}
假設(shè)您要查詢所有居住在特定城市的人:
GET /people/_search
{
"query": {
"match": {
"address.city": "New York"
}
}
}
返回結(jié)果將包含居住在紐約的人的文檔:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "people",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "Alice Johnson",
"address": {
"city": "New York",
"state": "NY"
},
"contact": {
"email": "alice@example.com",
"phone": "555-1234"
}
}
},
{
"_index": "people",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "Bob Smith",
"address": {
"city": "New York",
"state": "NY"
},
"contact": {
"email": "bob@example.com",
"phone": "555-5678"
}
}
}
]
}
}
- 查詢使用了
match查詢來查找居住在紐約的人。 - 返回結(jié)果包含了滿足查詢條件的人的文檔,每個(gè)文檔都包括了姓名、地址、聯(lián)系信息等嵌套字段的信息。
這個(gè)示例演示了如何使用對(duì)象類型字段來存儲(chǔ)和查詢嵌套的結(jié)構(gòu)化數(shù)據(jù)。對(duì)象類型非常適用于表示層次結(jié)構(gòu)的數(shù)據(jù),例如個(gè)人信息、產(chǎn)品屬性、訂單項(xiàng)目等。通過這種方式,可以輕松地訪問和操作嵌套的數(shù)據(jù),以滿足各種復(fù)雜數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)和查詢需求。
地理類型
在 Elasticsearch 映射操作中,地理類型(Geo)用于存儲(chǔ)地理位置信息,如經(jīng)度和緯度坐標(biāo)。這種類型允許索引和查詢地理位置數(shù)據(jù),以便執(zhí)行空間分析和地理搜索。
- 地理數(shù)據(jù):地理類型用于存儲(chǔ)地理位置信息,通常表示為經(jīng)度和緯度坐標(biāo)。這種類型非常適用于存儲(chǔ)地理空間數(shù)據(jù),如地點(diǎn)、地理區(qū)域和地理坐標(biāo)。
- 地理索引:Elasticsearch 使用地理類型來構(gòu)建地理索引,以便更容易地執(zhí)行地理位置相關(guān)的查詢和分析。這包括范圍查詢、距離查詢、聚合等。
- 支持的地理形狀:Elasticsearch 支持多種地理形狀,例如點(diǎn)、線、多邊形等,使您能夠索引和查詢各種地理空間數(shù)據(jù)。
- 地理距離計(jì)算:地理類型允許您計(jì)算地理坐標(biāo)之間的距離,以便查找在一定距離內(nèi)的地理位置。
假設(shè)您正在使用 Elasticsearch 存儲(chǔ)餐廳信息,每個(gè)餐廳都有一個(gè)地理坐標(biāo),希望能夠查詢距離特定位置一定距離范圍內(nèi)的餐廳。創(chuàng)建一個(gè)名為 "restaurants" 的索引,其中包含了餐廳名稱(name)和地理坐標(biāo)(location)。
PUT /restaurants
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"location": {
"type": "geo_point"
}
}
}
}
插入一些示例餐廳數(shù)據(jù)的請(qǐng)求:
POST /restaurants/_doc/1
{
"name": "Restaurant A",
"location": {
"lat": 40.7120,
"lon": -74.0050
}
}
POST /restaurants/_doc/2
{
"name": "Restaurant B",
"location": {
"lat": 40.7130,
"lon": -74.0070
}
}
POST /restaurants/_doc/3
{
"name": "Restaurant C",
"location": {
"lat": 40.7110,
"lon": -74.0080
}
}
假設(shè)要查找距離紐約市中心(40.7128, -74.0060)10公里以內(nèi)的餐廳。
GET /restaurants/_search
{
"query": {
"bool": {
"filter": {
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40.7128,
"lon": -74.0060
}
}
}
}
}
}
返回結(jié)果將包含距離紐約市中心10公里以內(nèi)的餐廳。
{
"took": 12,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "restaurants",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"name": "Restaurant A",
"location": {
"lat": 40.7120,
"lon": -74.0050
}
}
},
{
"_index": "restaurants",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"name": "Restaurant B",
"location": {
"lat": 40.7130,
"lon": -74.0070
}
}
},
{
"_index": "restaurants",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"name": "Restaurant C",
"location": {
"lat": 40.7110,
"lon": -74.0080
}
}
}
]
}
}
- 查詢使用了
geo_distance查詢來查找距離指定地理坐標(biāo)一定距離范圍內(nèi)的餐廳。 - 返回結(jié)果包含了滿足查詢條件的餐廳文檔,每個(gè)文檔都包括了餐廳名稱和地理坐標(biāo)的信息。
這個(gè)示例演示了如何使用地理類型字段來存儲(chǔ)和查詢地理位置信息。地理類型非常適用于處理地理空間數(shù)據(jù),如地點(diǎn)搜索、附近搜索和地理分析等需求。通過這種方式,可以輕松地執(zhí)行地理空間查詢和分析,以滿足各種地理位置相關(guān)的查詢需求。
(五)動(dòng)態(tài)映射
動(dòng)態(tài)映射(Dynamic Mapping)是 Elasticsearch 中的一項(xiàng)功能,允許自動(dòng)檢測和創(chuàng)建索引映射,無需手動(dòng)定義字段的數(shù)據(jù)類型和屬性。當(dāng)索引文檔時(shí),Elasticsearch 根據(jù)文檔內(nèi)容自動(dòng)創(chuàng)建映射,包括字段的數(shù)據(jù)類型、分析器、索引選項(xiàng)等。這使得索引的管理更加靈活,特別適用于處理不斷變化的數(shù)據(jù)和不確定的數(shù)據(jù)結(jié)構(gòu)。
以下是常見的 JSON 數(shù)據(jù)類型和 Elasticsearch 索引類型的對(duì)應(yīng)表:
JSON 數(shù)據(jù)類型:字符串(String)
- Elasticsearch 索引類型:
text或keyword - 說明:字符串類型可以映射為
text類型用于全文搜索和分析,或映射為keyword類型用于精確匹配和聚合。
JSON 數(shù)據(jù)類型:整數(shù)(Integer)
- Elasticsearch 索引類型:
integer或long - 說明:整數(shù)類型可以映射為
integer類型(32 位有符號(hào)整數(shù))或long類型(64 位有符號(hào)整數(shù)),取決于數(shù)據(jù)范圍。
JSON 數(shù)據(jù)類型:浮點(diǎn)數(shù)(Float/Double)
- Elasticsearch 索引類型:
float或double - 說明:浮點(diǎn)數(shù)類型可以映射為
float類型(32 位浮點(diǎn)數(shù))或double類型(64 位浮點(diǎn)數(shù))。
JSON 數(shù)據(jù)類型:布爾值(Boolean)
- Elasticsearch 索引類型:
boolean - 說明:布爾值類型映射為
boolean類型,用于存儲(chǔ) true 或 false。
JSON 數(shù)據(jù)類型:日期和時(shí)間(Date/Time)
- Elasticsearch 索引類型:
date - 說明:日期和時(shí)間類型映射為
date類型,用于存儲(chǔ)日期和時(shí)間信息。
JSON 數(shù)據(jù)類型:數(shù)組(Array)
- Elasticsearch 索引類型:
array - 說明:JSON 數(shù)組通常映射為 Elasticsearch 中的數(shù)組,可以包含多個(gè)值。Elasticsearch 中的數(shù)組字段通常需要指定
nested類型,以支持多值字段的查詢和聚合。
JSON 數(shù)據(jù)類型:對(duì)象(Object)
- Elasticsearch 索引類型:
object - 說明:JSON 對(duì)象可以映射為 Elasticsearch 的對(duì)象類型,用于存儲(chǔ)嵌套的結(jié)構(gòu)化數(shù)據(jù)。
JSON 數(shù)據(jù)類型:地理坐標(biāo)(Geospatial Coordinates)
- Elasticsearch 索引類型:
geo_point - 說明:地理坐標(biāo)類型用于存儲(chǔ)經(jīng)度和緯度坐標(biāo),以支持地理位置相關(guān)的查詢和分析。
這個(gè)對(duì)應(yīng)表展示了常見的 JSON 數(shù)據(jù)類型與 Elasticsearch 索引類型之間的映射關(guān)系。當(dāng)索引文檔時(shí),Elasticsearch 會(huì)根據(jù)文檔的字段內(nèi)容自動(dòng)選擇合適的數(shù)據(jù)類型。如果需要更精細(xì)的控制,可以通過顯式映射來定義字段的數(shù)據(jù)類型和屬性。動(dòng)態(tài)映射為 Elasticsearch 提供了靈活性,使其適應(yīng)各種數(shù)據(jù)結(jié)構(gòu)和用例。
(六)多字段
在 Elasticsearch 中,多字段(Multi-Field)是一種索引映射策略,用于將一個(gè)字段存儲(chǔ)在多個(gè)不同的子字段中,每個(gè)子字段可以具有不同的數(shù)據(jù)類型或分析器。多字段的引入允許在一個(gè)字段上執(zhí)行多種操作,例如全文搜索、精確匹配、聚合等,同時(shí)保留原始數(shù)據(jù)的不同表示形式。
多字段的特點(diǎn)和用途
- 數(shù)據(jù)多樣性:多字段允許您在一個(gè)字段上存儲(chǔ)多個(gè)不同的數(shù)據(jù)表示,以適應(yīng)各種查詢需求。例如,一個(gè)字段可以同時(shí)存儲(chǔ)原始文本和分析后的詞匯。
- 支持不同數(shù)據(jù)類型:每個(gè)子字段可以具有不同的數(shù)據(jù)類型。例如,一個(gè)字段可以同時(shí)映射為
text類型用于全文搜索和keyword類型用于精確匹配。 - 支持不同分析器:每個(gè)子字段可以使用不同的文本分析器。這使得您可以在一個(gè)字段上執(zhí)行不同類型的文本分析。
- 靈活性:多字段使您能夠針對(duì)不同的查詢場景選擇最合適的子字段,同時(shí)保持原始數(shù)據(jù)的完整性。
- 支持復(fù)雜查詢:多字段允許您執(zhí)行復(fù)雜的查詢操作,例如同時(shí)執(zhí)行全文搜索和精確匹配,或者在多個(gè)子字段上執(zhí)行聚合操作。
多字段示例
假設(shè)有一個(gè)名為 "product" 的索引,其中包含了產(chǎn)品名稱(product_name)字段。希望能夠在同一字段上執(zhí)行全文搜索和精確匹配。以下是使用多字段的示例映射:
PUT /product
{
"mappings": {
"properties": {
"product_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
在上述映射中,我們定義了一個(gè) product_name 字段,并在該字段下創(chuàng)建了一個(gè)子字段 keyword,它具有 keyword 數(shù)據(jù)類型。這個(gè)子字段將用于精確匹配。
多字段的用法示例-全文搜索:要執(zhí)行全文搜索,可以使用原始字段 product_name。例如:
GET /product/_search
{
"query": {
"match": {
"product_name": "Elasticsearch"
}
}
}
多字段的用法示例-精確匹配:要執(zhí)行精確匹配,可以使用子字段 product_name.keyword。例如:
GET /product/_search
{
"query": {
"term": {
"product_name.keyword": "Elasticsearch"
}
}
}
在此示例中,我們分別使用原始字段和子字段執(zhí)行不同類型的查詢。
多字段的引入使得索引中的字段可以靈活地適應(yīng)各種查詢需求,同時(shí)保持原始數(shù)據(jù)的完整性。這在處理多樣性的數(shù)據(jù)和不同的查詢場景時(shí)非常有用。
三、總結(jié)
在本文中,我們深入探討了 Elasticsearch 中索引與映射的基本概念及其重要性。通過詳細(xì)的操作示例,我們了解了如何創(chuàng)建、更新和刪除索引,以及如何定義和修改映射,以優(yōu)化數(shù)據(jù)存儲(chǔ)和查詢性能。這些操作不僅是數(shù)據(jù)管理的基礎(chǔ),也是實(shí)現(xiàn)高效搜索和分析的關(guān)鍵。
索引和映射的管理對(duì)于確保數(shù)據(jù)的一致性、可用性和快速檢索至關(guān)重要。我們強(qiáng)調(diào)了使用合適的數(shù)據(jù)類型、設(shè)置合理的字段屬性以及根據(jù)業(yè)務(wù)需求進(jìn)行動(dòng)態(tài)映射調(diào)整的重要性。此外,掌握索引生命周期管理(ILM)和使用合適的分析器也是提升 Elasticsearch 性能的有效方法。
通過本文的介紹和示例,希望讀者能夠更好地理解 Elasticsearch 的索引與映射操作,從而在實(shí)際應(yīng)用中實(shí)現(xiàn)數(shù)據(jù)的高效管理和靈活檢索。未來,隨著數(shù)據(jù)規(guī)模的不斷增長和應(yīng)用場景的多樣化,深入掌握這些技術(shù)將為數(shù)據(jù)分析師和開發(fā)者帶來更多的優(yōu)勢(shì)和機(jī)遇。
到此這篇關(guān)于Elasticsearch 的索引管理與映射配置實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Elasticsearch索引映射配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring AOP 攔截器的基本實(shí)現(xiàn)
本篇文章主要介紹了詳解Spring AOP 攔截器的基本實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
mybatis于xml方式和注解方式實(shí)現(xiàn)多表查詢的操作方法
在數(shù)據(jù)庫中,單表的操作是最簡單的,但是在實(shí)際業(yè)務(wù)中最少也有十幾張表,并且表與表之間常常相互間聯(lián)系,本文給大家介紹mybatis于xml方式和注解方式實(shí)現(xiàn)多表查詢的操作方法,感興趣的朋友一起看看吧2023-12-12
java中ThreadPoolExecutor常識(shí)匯總
這篇文章主要介紹了java中ThreadPoolExecutor常識(shí)匯總,線程池技術(shù)在并發(fā)時(shí)經(jīng)常會(huì)使用到,java中的線程池的使用是通過調(diào)用ThreadPoolExecutor來實(shí)現(xiàn)的,需要的朋友可以參考下2019-06-06
淺析java中ArrayList與Vector的區(qū)別以及HashMap與Hashtable的區(qū)別
以下是對(duì)java中ArrayList與Vector的區(qū)別以及HashMap與Hashtable的區(qū)別進(jìn)行了詳細(xì)的解析。需要的朋友可以過來參考下2013-08-08
關(guān)于springboot集成swagger3時(shí)spring-plugin-core報(bào)錯(cuò)的問題
這篇文章主要介紹了關(guān)于springboot集成swagger3時(shí)spring-plugin-core報(bào)錯(cuò)的問題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析
這篇文章主要介紹了redis分布式鎖RedissonLock的實(shí)現(xiàn)細(xì)節(jié)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

