簡介
ElaticSearch勋颖,簡稱ES梆掸。
ES 是一個開源的高擴(kuò)展的分布式全文檢索引擎,它可以近乎實(shí)時的存儲牙言、檢索數(shù)據(jù)酸钦;
其擴(kuò)展性很好,可擴(kuò)展到上百臺服務(wù)器咱枉,處理PB級別的數(shù)據(jù)卑硫。
ES 使用Java開發(fā)并使用Lucene作為其核心來實(shí)現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful-API
來隱藏Lucene的復(fù)雜性蚕断,從而讓全文搜索變得更簡單欢伏。
ES核心基礎(chǔ)概念
1)index-索引
一個索引就是一個擁有幾分相似特征的文檔的集合,類比mysql中的數(shù)據(jù)庫亿乳;2)type-類型
一個type是index索引在邏輯上的一個分類/分區(qū)硝拧,可類比mysql中的表;一個索引中葛假,早期版本中一個index可定義多個type障陶,后期版本逐漸移除;見下文詳述聊训;- filed-字段
相當(dāng)于MySQL表中的字段抱究,對不同文檔數(shù)據(jù)根據(jù)屬性進(jìn)行的分類標(biāo)識;
- filed-字段
4)mapping-映射
mapping 對于剛?cè)腴TES的同學(xué)來說带斑,比較抽象鼓寺,它用來定義文檔及其包含的字段如何存儲和索引(使用何種存儲類型或索引方式);
可類比于MySQL的create table
語句勋磕,指定某個字段是int妈候,某個字段是文本,哪個字段使用什么索引等等……
比如挂滓,mapping中可指定同學(xué)姓名為text
類型苦银,并使用ik_smart
分詞器進(jìn)行存儲和檢索;5)document-文檔
一個document是一個可被索引的基礎(chǔ)信息單元杂彭,類比與MySQL中的一行數(shù)據(jù)墓毒;
ES 與 MySQL 的基本映射關(guān)系如下:
MySQL ‐> database ‐> Table ‐> Rows ‐> Columns
ES ‐> index ‐> Type ‐> Documents ‐> Fields
版本變遷
type (類型)
其實(shí)是ES早期版本中的設(shè)計缺陷:
- 5.x 及以前的版本,一個 index 下面支持創(chuàng)建多個type亲怠,類似于MySQL的一個 database 中創(chuàng)建多個表所计;
- 6.x 版本改為一個 index 只支持一個 type, 但 type 名稱可自定義;類比于MySQL的一個 database 中只允許創(chuàng)建一個表团秽,但表名可自定義主胧;
- 7.x 版本叭首,type 默認(rèn)名稱為
_doc
,不再支持自定義; - 8.x 版本后踪栋,移除 type 定義焙格,可理解為ES本身就是MySQL中一個超大的database,每個index就是其中一個table夷都;
移除 type 定義眷唉,其實(shí)很好理解,本來 type 的設(shè)計就是一種冗余的存在囤官,完全可通過為 index 添加不同后綴來區(qū)分同一業(yè)務(wù)下的不同類型冬阳;
創(chuàng)建索引
官網(wǎng)文檔參考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/indices-put-mapping.html
1 、創(chuàng)建空索引(類似于創(chuàng)建mysql空庫)
### 創(chuàng)建名為 twitter 的空索引
curl -X PUT "localhost:9200/twitter?pretty" -H 'Content-Type: application/json' -d'{}'
### 創(chuàng)建索引附帶設(shè)置信息等
-d'
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"_doc" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
}
'
2 党饮、為索引添加索引字段(類似于創(chuàng)建mysql表)
## 注:_doc 為默認(rèn)type肝陪,7.x 版本不再支持自定義,8.x 版本后移除
curl -X PUT "localhost:9200/twitter/_mapping/_doc?pretty" -H 'Content-Type: application/json' -d'
{
"dynamic": "true", ## 允許動態(tài)根據(jù)灌入數(shù)據(jù)創(chuàng)建mapping
"properties": {
"auto_id": {
"type": "long"
},
"create_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
},
"student_name": {
"type": "text", ## 設(shè)定學(xué)生姓名為文本類型
"fields": {
"keyword": {
"type": "keyword", ## 為姓名添加 keyword 無分詞索引
"ignore_above": 256 ## 最大索引長度256刑顺,即上限
}
},
"analyzer": "ik_smart" ## 設(shè)定學(xué)生姓名的查詢分詞器
}
}
}
'
向索引插入數(shù)據(jù)
1氯窍、 為 Twitter 索引添加名為 ·湯姆克魯斯· 的學(xué)生
## 注:_doc/1?pretty,此處為顯示指定 `id(ES內(nèi)置_id)` 為 1蹲堂,不指定的情況ES會自動生成 `_id` 值狼讨;
curl -X PUT "localhost:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"student_name" : "湯姆克魯斯",
"create_date" : "2019-11-15",
"auto_id" : 111
}
'
查詢索引
1、查詢 Twitter 索引下姓氏為 · 克魯斯· 的學(xué)生贯城,并按創(chuàng)建時間倒序熊楼,同時對檢索命中的結(jié)果做高亮(highlight)展示
curl -X GET "localhost:9200/twitter/_doc/_search?pretty" -H 'Content-Type: application/json' -d'
{
"sort": {
"create_date": "desc"
},
"highlight": {
"fields": {
"student_name": {}
}
},
"query": {
"term": {
"student_name.keyword": {
"value": "克魯斯"
}
}
}
}
'