《Elasticsearch 從入門到精通》共包含以下 2 2 2 篇文章:
- Elasticsearch 從入門到精通(一):基本介紹
- Elasticsearch 從入門到精通(二):基礎(chǔ)使用
?? 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 ?????? 吧 (點贊 ??、關(guān)注 ??、收藏 ??)?。?!您的支持 ?????? 將激勵 ?? 博主輸出更多優(yōu)質(zhì)內(nèi)容?。?!
對 Elasticsearch 操作有多種工具,這里我們使用 Kibana,先簡單介紹下。
1.Kibana 的基本介紹
- Kibana 是一個開源的分析和可視化平臺,設(shè)計用于和 Elasticsearch 一起工作。
- 可以用 Kibana 來搜索,查看,并和存儲在 Elasticsearch 索引中的數(shù)據(jù)進行交互。
- 可以輕松地執(zhí)行高級數(shù)據(jù)分析,并且以各種圖標(biāo)、表格和地圖的形式可視化數(shù)據(jù)。
- Kibana 使得理解大量數(shù)據(jù)變得很容易。它簡單的、基于瀏覽器的界面使你能夠快速創(chuàng)建和共享動態(tài)儀表板,實時顯示 Elasticsearch 查詢的變化。
2.ES 操作前須知
2.1 REST 和 CURL 介紹:
2.1.1 REST
REST(REpresentational State Transfer)從字面意思看 “表述性狀態(tài)傳輸”,它通常是開發(fā)的一種約定,當(dāng)所有的開發(fā)者都遵從這種約定的時候,可以大大簡化開發(fā)的溝通成本。REST 約定用 HTTP 的請求頭 POST
、GET
、PUT
、DELETE
正好可以對應(yīng) CRUD(Create
、Read
、Update
、Delete
)四種數(shù)據(jù)操作。
如下表所示:
HTTP 方法 | 數(shù)據(jù)處理 | 說明 |
---|---|---|
POST | Create | 新增一個沒有 ID 的資源 |
GET | Read | 獲取一個資源 |
PUT | Update | 更新一個資源?;蛐略鲆粋€含 ID 的資源(如果 ID 不存在) |
DELETE | Delete | 刪除一個資源 |
2.1.2 CURL
CURL 是利用 URL 語法在命令行方式下工作的開源文件傳輸工具,使用 curl
可以簡單實現(xiàn)常見的 get
/ post
請求。簡單的認(rèn)為是可以在命令行下面訪問 URL 的一個工具。在 Centos 的默認(rèn)庫里面是有 curl
工具的,如果沒有請 yum
安裝即可。
curl
后面可跟參數(shù):
-
-X
指定 HTTP 的請求方法,有 HEAD、GET、POST、PUT、DELETE -
-d
指定要傳輸?shù)臄?shù)據(jù) -
-H
指定 HTTP 請求頭信息
Elasticsearch 提供了非常全面和強大的 REST API,通過這些 API,我們可以了解集群的信息。這些 API 可以做如下事情:
- 檢查集群、節(jié)點和索引的情況、狀態(tài)和統(tǒng)計。
- 管理集群、節(jié)點、索引數(shù)據(jù)和文檔數(shù)據(jù)。
- 執(zhí)行 CRUD(創(chuàng)建、讀取、更新和刪除)操作,可以對索引進行操作。
- 執(zhí)行高級搜索操作,如分頁、排序、過濾、腳本、聚合及其他操作。
2.2 ES 請求方式
首先說下請求 ES 的方式,后面例子都是這種方式。
- 請求參數(shù):
curl -X{PUT} http://{host}:{port}
- 例如:
curl -XPUT http://120.0.0.1:9200/blog1?pretty
- 在 Kibana 中可直接輸入
PUT /blog1?pretty
- 例如:
-
body
參數(shù):{參數(shù)內(nèi)容}
{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
注意:請求方法 GET 和 DELETE 上面介紹了,比較簡單,不過多說,主要說下 POST 和 PUT 在 ES 中的使用。
-
POST 和 PUT 共同點
- ES 中的 PUT 和 POST 同樣都具備創(chuàng)建和更新的功能。
-
POST 和 PUT 不同點
- PUT 需要精確到某一個資源文件,這樣才能進行對數(shù)據(jù)的更新和創(chuàng)建操作。
- POST 能對整個資源集合進行操作,如果沒有指定具體修改的文件
id
,那么 POST 指令會自動生成一個唯一的id
進行文件的創(chuàng)建,并將數(shù)據(jù)寫入該文件中。如果指定了文件id
,那么就會根據(jù)填寫的參數(shù)對數(shù)據(jù)進行創(chuàng)建和更新操作。 - PUT、GET、DELETE 是冪等的,由于同一條這樣的指令,執(zhí)行多次結(jié)果都一樣。比如
PUT /uri/xxx
多次,那么結(jié)果和這條指令執(zhí)行一次效果一樣。 - 而 POST 是非冪等的,執(zhí)行多次更改多次服務(wù)器狀態(tài)。比如
POST /uri
多次,那么生成多個 UUID 的 document,執(zhí)行多次效果和執(zhí)行一次不一樣。
3.ES API 操作
3.1 創(chuàng)建索引
ES 的索引是一個邏輯概念,它包括了分詞列表及文檔列表。同一個索引中存儲了相同類型的文檔,它就相當(dāng)于 MySQL 中的表,或相當(dāng)于 Mongodb 中的集合。
關(guān)于 索引 這個語:
- 索引(名詞):ES 是基于 Lucene 構(gòu)建的一個搜索服務(wù),它要從索引庫搜索符合條件索引數(shù)據(jù)。
- 索引(動詞):索引庫剛創(chuàng)建起來是空的,將數(shù)據(jù)添加到索引庫的過程稱為索引。
創(chuàng)建索引命令:PUT http://node01:9200/索引名稱?pretty
上面命令最后有個 pretty
,什么意思呢,在任意的查詢字符串中增加 pretty
參數(shù),會讓 Elasticsearch 美化輸出(pretty-print
)JSON 響應(yīng)以便更加容易閱讀。
創(chuàng)建索引舉例:
打開 Kibana,找到 dev tools
出現(xiàn)如下頁面,左邊是 執(zhí)行區(qū),右邊是結(jié)果 返回區(qū):
左邊框中執(zhí)行以下語句:
curl -XPUT http://node01:9200/blog001/?pretty
上述語句直接粘貼到 Kibana 的 dev tools
,如下左邊所示,它會自動幫我們格式化語句,像 curl -X
和地址都自動隱藏了。
上面執(zhí)行的命令并沒有設(shè)置 body
參數(shù),執(zhí)行的就是默認(rèn)參數(shù)。
執(zhí)行如下帶 body
參數(shù)的語句:
curl -XPUT http://node01:9200/blog2/?pretty
{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
-
number_of_shards
:設(shè)置 分片 的數(shù)量,在集群中通常設(shè)置多個分片,表示一個索引庫將拆分成多片分別存儲不同的結(jié)點,提高了 ES 的處理能力和高可用性,使用單機環(huán)境,這里設(shè)置為 1。 -
number_of_replicas
:設(shè)置 副本 的數(shù)量,設(shè)置副本是為了提高 ES 的高可靠性,單機環(huán)境設(shè)置為 0。
創(chuàng)建索引相當(dāng)于關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫還是表?
- 如果相當(dāng)于數(shù)據(jù)庫,就表示一個索引庫可以創(chuàng)建很多不同類型的文檔,這在 ES 中也是允許的。
- 如果相當(dāng)于表,就表示一個索引庫只能存儲相同類型的文檔,ES 官方建議在一個索引庫中只存儲相同類型的文檔。
3.2 插入文檔
ES 中的文檔相當(dāng)于 MySQL 數(shù)據(jù)庫表中的數(shù)據(jù)。
使用 PUT 將一個文檔添加到 /_doc
(文檔類型),并為該文檔分配 ID
為
1
1
1。URL 路徑顯示為 index/doctype/ID
(索引 / 文檔類型 / ID)。
curl -XPUT http://node01:9200/blog01/_doc/1?pretty
{"id": "1", "title": "五分鐘學(xué)大數(shù)據(jù)"}
注意:上面說的文檔類型,也叫 映射類型(type
)。
什么是映射類型?
簡單理解相當(dāng)于關(guān)系數(shù)據(jù)庫的表(不準(zhǔn)確,后面會說),每個索引里都可以有一個或多個映射類型,映射類型是 index
中的一個邏輯數(shù)據(jù)分類,一個映射類型下的文檔(document
),都有相同的字段(field
)。
ES
6.0
6.0
6.0 之前的版本有映射類型(type
)概念,但是官方將在 ES
9.0
9.0
9.0 版本中徹底刪除映射類型。
為什么要移除映射類型?
開始的時候,我們說 “索引(index
)” 類似于 SQL 數(shù)據(jù)庫中的 “數(shù)據(jù)庫”,將 “類型(type
)” 等同于 “表”。
這是一個糟糕的類比,并且導(dǎo)致了一些錯誤的假設(shè)。在 SQL 數(shù)據(jù)庫中,表之間是相互獨立的。一個表中的各列并不會影響到其它表中的同名的列。而在 映射類型(mapping type
)中卻不是這樣的。
在同一個 Elasticsearch 索引中,其中不同映射類型中的同名字段在內(nèi)部是由同一個 Lucene 字段來支持的。換句話說,假如有兩個映射類型 user
和 tweet
,user
類型中的 user_name
字段與 tweet
類型中的 user_name
字段是完全一樣的,并且兩個 user_name
字段在兩個類型中必須具有相同的映射(定義)。
這會在某些情況下導(dǎo)致一些混亂,比如,在同一個索引中,當(dāng)你想在其中的一個類型中將 deleted
字段作為 date
類型,而在另一個類型中將其作為 boolean
字段。
在此之上需要考慮一點,如果同一個索引中存儲的各個實體如果只有很少或者根本沒有同樣的字段,這種情況會導(dǎo)致稀疏數(shù)據(jù),并且會影響到 Lucene 的高效壓縮數(shù)據(jù)的能力。
基于這些原因,將映射類型的概念從 Elasticsearch 中移除。
所以在 ES
6.0
6.0
6.0 及之后版本中要弱化映射類型的概念,盡量設(shè)置一個無任何業(yè)務(wù)含義的名字,本文檔的所有映射類型都統(tǒng)一設(shè)為 _doc
。
3.3 查詢文檔
curl -XGET http://node01:9200/blog01/_doc/1?pretty
3.4 更新文檔
curl -XPUT http://node01:9200/blog01/_doc/1?pretty
{"id": "1", "title": "公眾號【五分鐘學(xué)大數(shù)據(jù)】"}
3.5 搜索文檔
GET /blog01/article/_search?q=title:公眾號【五分鐘學(xué)大數(shù)據(jù)】
返回值說明
-
Hits
- 返回結(jié)果中最重要的部分是
hits
,它包含total
字段來表示匹配到的文檔總數(shù),并且一個hits
數(shù)組包含所查詢結(jié)果的前十個文檔。 - 在
hits
數(shù)組中每個結(jié)果包含文檔的_index
、_type
、_id
,加上_source
字段。這意味著我們可以直接從返回的搜索結(jié)果中使用整個文檔。這不像其他的搜索引擎,僅僅返回文檔的 ID,需要你單獨去獲取文檔。 - 每個結(jié)果還有一個
_score
,它衡量了文檔與查詢的匹配程度。默認(rèn)情況下,首先返回最相關(guān)的文檔結(jié)果,就是說,返回的文檔是按照_score
降序排列的。 -
max_score
值是與查詢所匹配文檔的_score
的最大值。
- 返回結(jié)果中最重要的部分是
-
took
-
took
值告訴我們執(zhí)行整個搜索請求耗費了多少毫秒。
-
-
Shard
-
_shards
部分告訴我們在查詢中參與分片的總數(shù),以及這些分片成功了多少個失敗了多少個。正常情況下我們不希望分片失敗,但是分片失敗是可能發(fā)生的。 - 如果我們遭遇到一種災(zāi)難級別的故障,在這個故障中丟失了相同分片的原始數(shù)據(jù)和副本,那么對這個分片將沒有可用副本來對搜索請求作出響應(yīng)。假若這樣,Elasticsearch 將報告這個分片是失敗的,但是會繼續(xù)返回剩余分片的結(jié)果。
-
-
timeout
-
timed_out
值告訴我們查詢是否超時。默認(rèn)情況下,搜索請求不會超時。 如果低響應(yīng)時間比完成結(jié)果更重要,你可以指定timeout
為 10 10 10 或者 10 m s 10ms 10ms,或者 1 s 1s 1s:GET /_search?timeout=10ms
- 在請求超時之前,Elasticsearch 將會返回已經(jīng)成功從每個分片獲取的結(jié)果。
-
3.6 刪除文檔
DELETE /blog01/article/1?pretty
3.7 刪除索引
DELETE /blog01?pretty
3.8 創(chuàng)建映射
在索引中每個文檔都包括了一個或多個字段(field
),創(chuàng)建映射就是向索引庫中創(chuàng)建字段及字段類型等的過程,下面是 document
和 field
與關(guān)系數(shù)據(jù)庫的概念的類比:
- 文檔(
Document
)? Row 記錄 - 字段(
Field
) ? Columns 列
為什么要映射?
ES 中的文檔等價于 Java 中的對象,那么在 Java 對象中有字段類型(比如 string
、int
、long
等),同理在 ES 索引中的具體字段也是有類型的。
像下面這個操作:
PUT /document/_doc/1
{
"title" : "Elasticsearch 怎么學(xué)",
"author" : "五分鐘學(xué)大數(shù)據(jù)",
"titleScore" : 60
}
這種操作并沒有指定字段類型,那么 Elasticsearch 會自動根據(jù)數(shù)據(jù)類型的格式識別字段的類型;
查看索引的字段類型:
GET /document/_mapping
可以發(fā)現(xiàn) titleScore
的類型是 long
。
然后在插入一條數(shù)據(jù),注意此時 titleScore
的值不是 long
類型:
PUT /document/_doc/2
{
"title": "Elasticsearch 怎么學(xué)",
"author": "五分鐘學(xué)大數(shù)據(jù)",
"titleScore": 66.666
}
查詢數(shù)據(jù):
GET /document/_doc/2
我們會發(fā)現(xiàn) ES 能存入,并沒有報錯(注意),這其實是一個問題,因為如果后期 Elaticsearch 對接 Java 的時候,我們會寫一個類對數(shù)據(jù)做封裝,比如:
class Article{
private String title;
private String author;
private String titleScore
}
對于 titleScore
,設(shè)置什么類型合適?使用 long
類型,那么后面肯定會有數(shù)據(jù)格式轉(zhuǎn)換的異常。
所以,我們?nèi)绻芴崆爸雷侄晤愋?,那么最好使?mapping
的映射管理,提前指定字段的類型,防止后續(xù)的程序問題。
先刪除之前創(chuàng)建的索引:DELETE document
創(chuàng)建索引,并指定映射:
PUT document
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"author": {
"type": "text"
},
"titleScore": {
"type": "double"
}
}
}
}
查看索引:GET document/_mapping
對這個索引繼續(xù)添加字段:
POST /document/_mapping
{
"properties": {
"number": {
"type": "text"
}
}
}
查看索引:GET document/_mapping
3.9 映射字段的類型
在 Elasticsearch 中,每一個字段都有一個類型(type
)。以下為 Elasticsearch 中可以使用的類型:
分類 | 類型名稱 |
|
---|---|---|
簡單類型 | text |
需要進行全文檢索的字段,通常使用 text 類型來對應(yīng)正文、產(chǎn)品描述或者短文等非結(jié)構(gòu)化文本數(shù)據(jù)。分詞器先會將文本進行分詞轉(zhuǎn)換為詞條列表。將來就可以基于詞條來進行檢索了。文本字段不能用戶排序、也很少用戶聚合計算。 |
簡單類型 | keyword |
使用 keyword 來對應(yīng)結(jié)構(gòu)化的數(shù)據(jù),如 ID、電子郵件地址、主機名、狀態(tài)代碼、郵政編碼或標(biāo)簽??梢允褂?keyword 來進行排序或聚合計算。注意:keyword 是不能進行分詞的。 |
簡單類型 | date |
保存格式化的日期數(shù)據(jù),例如:2015-01-01 或者 2015/01/01 12:10:30 。在 Elasticsearch 中,日期都將以字符串方式展示??梢越o date 指定格式:"format":"yyyy-MM-dd HH:mm:ss" 。 |
簡單類型 |
long / integer / short / byte
|
64 64 64 位整數(shù) / 32 32 32 位整數(shù) / 16 16 16 位整數(shù) / 8 8 8 位整數(shù) |
簡單類型 |
double / float / half_float
|
64 64 64 位雙精度浮點 / 32 32 32 位單精度浮點 / 16 16 16 位半精度浮點 |
簡單類型 | boolean |
true / false
|
簡單類型 | ip |
IPV4(192.168.1.110 )/ IPV6(192.168.0.0/16 ) |
JSON 分層嵌套類型 | object |
用于保存 JSON 對象 |
JSON 分層嵌套類型 | nested |
用于保存 JSON 數(shù)組 |
特殊類型 | geo_point |
用于保存經(jīng)緯度坐標(biāo) |
特殊類型 | geo_shape |
用于保存地圖上的多邊形坐標(biāo) |
3.10 獲取映射字段
語法:GET /{index}/_mapping/field/{field}
GET /document/_mapping/field/number
3.11 索引庫配置管理(settings)
所謂的 settings
就是用來修改索引分片和副本數(shù)的。
比如有的重要索引,副本數(shù)很少甚至沒有副本,那么我們可以通過 setting
來添加副本數(shù)。
查看 settings
:GET /document/_settings
可以看到當(dāng)前的副本數(shù)是
1
1
1,那么為了提高容錯性,我們可以把副本數(shù)改成
2
2
2:
PUT /document/_settings
{
"number_of_replicas": 2
}
注意:副本可以改,分片不能改!
執(zhí)行如下語句會報錯:
PUT /document/_settings
{
"number_of_shards": 3
}
4.ES 花式查詢
我們先插入一些數(shù)據(jù),后面查詢時以這些數(shù)據(jù)為例。
在 Kibana 界面上執(zhí)行如下語句,插入一些數(shù)據(jù):
POST /student/_doc/_bulk
{ "index": { "_id": 1 }}
{ "name" : "liubei", "age" : 20 , "sex": "boy", "birth": "1996-01-02" , "about": "i like diaocan he girl" }
{ "index": { "_id": 2 }}
{ "name" : "guanyu", "age" : 21 , "sex": "boy", "birth": "1995-01-02" , "about": "i like diaocan" }
{ "index": { "_id": 3 }}
{ "name" : "zhangfei", "age" : 18 , "sex": "boy", "birth": "1998-01-02" , "about": "i like travel" }
{ "index": { "_id": 4 }}
{ "name" : "diaocan", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and sport" }
{ "index": { "_id": 5 }}
{ "name" : "panjinlian", "age" : 25 , "sex": "girl", "birth": "1991-01-02" , "about": "i like travel and wusong" }
{ "index": { "_id": 6 }}
{ "name" : "caocao", "age" : 30 , "sex": "boy", "birth": "1988-01-02" , "about": "i like xiaoqiao" }
{ "index": { "_id": 7 }}
{ "name" : "zhaoyun", "age" : 31 , "sex": "boy", "birth": "1997-01-02" , "about": "i like travel and music" }
{ "index": { "_id": 8 }}
{ "name" : "xiaoqiao", "age" : 18 , "sex": "girl", "birth": "1998-01-02" , "about": "i like caocao" }
{ "index": { "_id": 9 }}
{ "name" : "daqiao", "age" : 20 , "sex": "girl", "birth": "1996-01-02" , "about": "i like travel and history" }
4.1 使用 match_all 做查詢
GET /student/_doc/_search?pretty
{
"query": {
"match_all": {}
}
}
問題:通過 match_all
匹配后,會把所有的數(shù)據(jù)檢索出來,但是往往真正的業(yè)務(wù)需求并非要找全部的數(shù)據(jù),而是檢索出自己想要的;并且對于 ES 集群來說,直接檢索全部的數(shù)據(jù),很容易造成 GC 現(xiàn)象。所以,我們要學(xué)會如何進行高效的檢索數(shù)據(jù)。
4.2 通過關(guān)鍵字段進行查詢
GET /student/_doc/_search?pretty
{
"query": {
"match": {
"about": "travel"
}
}
}
如果此時想查詢喜歡旅游的,并且不能是男孩的,怎么辦?
這樣寫是否可以:
GET /student/_doc/_search?pretty
{
"query": {
"match": {
"about": "travel",
"sex": "girl"
}
}
}
發(fā)現(xiàn)報錯了,因為一個 match
下,不能出現(xiàn)多個字段值,需要使用復(fù)合查詢。
4.3 bool 的復(fù)合查詢
當(dāng)出現(xiàn)多個查詢語句組合的時候,可以用 bool
來包含。
bool
合并聚包含:must
,must_not
或者 should
, should
表示 or
的意思。
例:查詢非男性中喜歡旅行的人
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": {
"match": {
"about": "travel"
}
},
"must_not": {
"match": {
"sex": "boy"
}
}
}
}
}
4.4 bool 的復(fù)合查詢中的 should
should
表示可有可無的(如果 should
匹配到了就展示,否則就不展示)
例:查詢喜歡旅行的,如果有男性的則顯示,否則不顯示
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": {
"match": {
"about": "travel"
}
},
"should": {
"match": {
"sex": "boy"
}
}
}
}
}
4.5 term 匹配
使用 term
進行精確匹配(比如數(shù)字,日期,布爾值或 not_analyzed
的字符串(未經(jīng)分析的文本數(shù)據(jù)類型))。
語法:
{ "term": { "age": 20 }}
{ "term": { "date": "2018-04-01" }}
{ "term": { "sex": “boy” }}
{ "term": { "about": "trivel" }}
例如:
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": {
"term": {
"about": "travel"
}
},
"should": {
"term": {
"sex": "boy"
}
}
}
}
}
4.6 使用 terms 匹配多個值
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": {
"terms": {
"about": [
"travel",
"history"
]
}
}
}
}
}
注意:term
和 match
區(qū)別:
-
term
主要是用于精確的過濾比如說:“我愛你” - 在
match
下面匹配可以為包含:我、愛、你、我愛等等的解析器 - 在
term
語法下面就精準(zhǔn)匹配到:“我愛你”
4.7 range 過濾
Range 過濾允許我們按照指定的范圍查找一些數(shù)據(jù):
-
gt
:大于 -
gae
:大于等于 -
lt
:小于 -
lte
:小于等于
例:查找出大于 20 20 20 歲,小于等于 25 25 25 歲的學(xué)生
GET /student/_doc/_search?pretty
{
"query": {
"range": {
"age": {
"gt": 20,
"lte": 25
}
}
}
}
4.8 exists 和 missing 過濾
exists
和 missing
過濾可以找到文檔中是否包含某個字段或者是沒有某個字段。
例:查找字段中包含 age 的文檔
GET /student/_doc/_search?pretty
{
"query": {
"exists": {
"field": "age"
}
}
}
4.9 bool 的多條件過濾
用 bool
也可以像之前 match
一樣來過濾多行條件:
-
must
:多個查詢條件的完全匹配,相當(dāng)于and
。 -
must_not
:多個查詢條件的相反匹配,相當(dāng)于not
。 -
should
:至少有一個查詢條件匹配,相當(dāng)于or
。
例:過濾出 about 字段包含 travel 并且年齡大于 20 20 20 歲小于 30 30 30 歲的同學(xué)
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": [
{
"term": {
"about": {
"value": "travel"
}
}
},
{
"range": {
"age": {
"gte": 20,
"lte": 30
}
}
}
]
}
}
}
4.10 查詢與過濾條件合并
通常復(fù)雜的查詢語句,我們也要配合過濾語句來實現(xiàn)緩存,用 filter
語句就可以來實現(xiàn)。
例:查詢出喜歡旅行的,并且年齡是 20 20 20 歲的文檔
GET /student/_doc/_search?pretty
{
"query": {
"bool": {
"must": {
"match": {
"about": "travel"
}
},
"filter": [
{
"term": {
"age": 20
}
}
]
}
}
}
5.零停機重新索引數(shù)據(jù)
實際生產(chǎn),對于文檔的操作,偶爾會遇到這種問題:
某一個字段的類型不符合后期的業(yè)務(wù)了,但是當(dāng)前的索引已經(jīng)創(chuàng)建了,我們知道 ES 在字段的 mapping
建立后就不可再次修改 mapping
的值。
5.1 新建索引庫 articles1
PUT articles1
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"dynamic": "strict",
"properties": {
"id": {
"type": "text",
"store": true
},
"title": {
"type": "text",
"store": true
},
"readCounts": {
"type": "integer",
"store": true
},
"times": {
"type": "text",
"index": false
}
}
}
}
5.2 索引庫 articles1 添加數(shù)據(jù)
PUT articles1/_doc/1
{
"id": "1",
"title": "世界1",
"readCounts": 2,
"times": "2022-05-01"
}
5.3 新建索引庫 articles2
PUT articles2
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"dynamic": "strict",
"properties": {
"id": {
"type": "text",
"store": true
},
"title": {
"type": "text",
"store": true
},
"readCounts": {
"type": "integer",
"store": true
},
"times": {
"type": "date",
"index": false
}
}
}
}
5.4 拷貝數(shù)據(jù)并驗證
POST _reindex
{
"source": {
"index": "articles1"
},
"dest": {
"index": "articles2"
}
}
驗證數(shù)據(jù):文章來源:http://www.zghlxwxcb.cn/news/detail-857742.html
GET articles2/_doc/1
文章來源地址http://www.zghlxwxcb.cn/news/detail-857742.html
到了這里,關(guān)于【Elasticsearch】Elasticsearch 從入門到精通(二):基礎(chǔ)使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!