1. 核心概念
-
索引(index)
類似的數(shù)據(jù)放在一個索引贼邓,非類似的數(shù)據(jù)放在不同索引巡揍,一個索引也可以理解成一個關系型數(shù)據(jù)庫主穗。
-
類型(type)
代表document屬于index中的那個類別(type)缭受,也有一種說法:一種type就像是數(shù)據(jù)庫的表分瘾。
如:dept表,user表
ES每個版本之間區(qū)別很大:
ES 5.x 中一個index可以有多種type紊婉。
ES 6.x 中一個index只能有一種type。
ES 7.x以后 要逐漸移除type這個概念辑舷。
-
映射(mapping)
mapping 定義了每個字段的類型等信息喻犁。相當于關系型數(shù)據(jù)庫中的表結(jié)構(gòu)。
常用數(shù)據(jù)類型:text何缓、keyword肢础、number、array碌廓、range传轰、boolean、date谷婆、geo_point慨蛙、ip、nested纪挎、object
類型介紹:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#_multi_fields_2
關系型數(shù)據(jù)庫(如MySQL) 非關系型數(shù)據(jù)庫(Elasticsearch) 數(shù)據(jù)庫 Database 索引 Index 表 Table 索引 Index 類型(原為Type) 數(shù)據(jù)行 Row 文檔 Document 數(shù)據(jù)列 Column 字段 Field 約束 Schema 映射 Mapping
2. 索引操作
2.1 創(chuàng)建索引
Elasticsearch采用Rest風格API期贫,因此其API就是一次http請求,你可以用任何工具發(fā)起http請求
語法:
PUT /索引名稱
{
"settings": {
"屬性名": "屬性值"
}
}
settings:就是索引庫設置异袄,其中可以定義索引庫的各種屬性 比如分片數(shù) 副本數(shù)等通砍,目前我們可以不設置,都走默認
示例:
PUT /demo-index
2.2 判斷索引是否存在
語法:
HEAD /索引名稱
示例:
HEAD /demo-index
2.3 查看索引
get 請求可以幫我們查看索引的相關屬性信息烤蜕。
2.3.1 查看單個索引
語法:
GET /索引名稱
示例:
GET /demo-index
2.3.2 批量查詢索引
語法:
GET /索引名稱1,索引名稱2,索引名稱3,...
示例:
GET /demo-index,demo-index1
2.3.3 查看所有索引
語法:
方式一
GET _all
方式二:
GET /_cat/indices?v
綠色:索引的所有分片都正常分配封孙。
黃色:至少有一個副本沒有得到正確的分配。
紅色:至少有一個主分片沒有得到正確的分配讽营。
2.3.4 打開索引
語法:
POST /索引名稱/_open
2.3.5 關閉索引
語法:
POST /索引名稱/_close
2.3.6 刪除索引
語法:
DELETE /索引名稱1,索引名稱2,索引名稱3...
示例:
DELETE /demo-index1
再次查看虎忌,返回索引不存在
3. 映射操作
索引創(chuàng)建之后,等于有了關系型數(shù)據(jù)庫中的database橱鹏。Elasticsearch7.x取消了索引type類型的設置呐籽,不允許指定類型锋勺,默認為_doc,但字段仍然是有的狡蝶,我們需要設置字段的約束信息庶橱,叫做字段映射(mapping)
字段的約束包括但不限于:
- 字段的數(shù)據(jù)類型
- 是否要存儲
- 是否要索引
- 分詞器
3.1 創(chuàng)建映射字段
語法:
PUT /索引庫名/_mapping
{
"properties": {
"字段名": {
"type": "類型",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/mapping-params.html
字段名:任意填寫,下面指定許多屬性贪惹,例如:
-
type:類型
可以是text苏章、long、short奏瞬、date枫绅、integer、object等
index:是否索引硼端,默認為true
store:是否存儲并淋,默認為false
analyzer:指定分詞器
示例:
PUT /demo-index/_mapping
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"job": {
"type": "text",
"analyzer": "ik_max_word"
},
"payment": {
"type": "float"
}
}
}
上述案例中,就是給 demo-index 這個索引庫設置了3個字段
- name:企業(yè)名稱
- job:崗位
- payment:薪資
3.2 映射屬性詳解
3.2.1 type
Elasticsearch中支持的數(shù)據(jù)類型非常豐富:
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/mapping-types.html
-
String 類型
-
text
可分詞珍昨,不可參與聚合
-
keword
不可分詞县耽,數(shù)據(jù)會作為完整字段進行匹配,可以參與聚合
-
-
Numeric
-
基本數(shù)據(jù)類型
long镣典、interger兔毙、short、byte兄春、double澎剥、flfloat、half_flfloat
-
浮點數(shù)的高精度類型
scaled_flfloat
需要指定一個精度因子赶舆,比如10或100哑姚。Elasticsearch 會把真實值乘以這個因子后存儲,取出時再還原芜茵。
-
-
Date
elasticsearch 可以對日期格式化為字符串存儲蜻懦,但是建議我們存儲為毫秒值,存儲為long夕晓,節(jié)省空間宛乃。
-
Array
- 進行匹配時,任意一個元素 滿足蒸辆,都認為滿足
- 排序時征炼,如果升序則用數(shù)組中最小值來排序,如果降序則用數(shù)組中最大值來排序
-
Object
{ name:"Jack", age:21, girl : { name: "Rose", age:21 } }
如果存儲到索引庫的是對象類型躬贡,例如上面的girl谆奥,會把girl變成兩個字段:girl.name和girl.age
3.2.2 index
index影響字段的索引情況。
-
true
字段會被索引拂玻,則可以用來進行搜索酸些。默認值就是true
-
false
字段不會被索引宰译,不能用來搜索
index的默認值就是true,也就是說你不進行任何配置魄懂,所有字段都會被索引沿侈。
但是有些字段是我們不希望被索引的,就需要手動設置index為false市栗。
3.2.3 store
是否將數(shù)據(jù)進行獨立存儲缀拭。
原始的文本會存儲在 _source
里面,默認情況下其他提取出來的字段都不是獨立存儲的填帽,是從 _source
里面提取出來的蛛淋。當然你也可以獨立的存儲某個字段,只要設置store:true即可篡腌,獲取獨立存儲的字段要比從_source
中解析快得多褐荷,但是也會占用更多的空間,所以要根據(jù)實際業(yè)務需求來設置嘹悼,默認為false叛甫。
3.2.4 analyzer
指定分詞器
一般我們處理中文會選擇ik分詞器 ik_max_word
、ik_smart
3.3 查看映射關系
3.3.1 查看單個索引映射關系
語法:
GET /索引名稱/_mapping
示例:
GET /demo-index/_mapping
3.3.2 查看所有索引映射關系
方式一
GET _mapping
方式二
GET _all/_mapping
3.4 修改所有映射關系
語法:
PUT /索引庫名/_mapping
{
"properties": {
"字段名": {
"type": "類型",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
注意: 修改映射增加字段 做其它更改只能刪除索引 重新建立映射
3.5 一次性創(chuàng)建索引和映射
剛才 的案例中我們是把創(chuàng)建索引庫和映射分開來做绘迁,其實也可以在創(chuàng)建索引庫的同時,直接制定索引庫中的索引卒密。
基本語法:
put /索引庫名稱
{
"settings": {
"索引庫屬性名": "索引庫屬性值"
},
"mappings": {
"properties": {
"字段名": {
"映射屬性名": "映射屬性值"
}
}
}
}
示例:
PUT /demo-index2
{
"settings": {},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
4. 文檔操作
文檔缀台,即索引庫中的數(shù)據(jù),會根據(jù)規(guī)則創(chuàng)建索引哮奇,將來用于搜索膛腐。可以類比做數(shù)據(jù)庫中的一行數(shù)據(jù)鼎俘。
4.1 新增文檔
新增文檔時哲身,涉及到id的創(chuàng)建方式,手動指定或者自動生成贸伐。
4.1.1 手動指定id
語法:
POST /索引名稱/_doc/{id}
{
"field1": "value1",
"field2": "value2"
}
示例:
POST /demo-index/_doc/1
{
"name": "阿里巴巴",
"job": "運維工程師",
"payment": "20000.0"
}
4.1.2 自動生成id
語法:
POST /索引名稱/_doc
{
"field1": "value1",
"field2": "value2"
}
示例:
POST /demo-index/_doc
{
"name": "百度",
"job": "算法工程師",
"payment": "30000.0"
}
可以看到結(jié)果顯示為: created 勘天,代表創(chuàng)建成功。
另外捉邢,需要注意的是脯丝,在響應結(jié)果中有個 _id
字段,這個就是這條文檔數(shù)據(jù)的 唯一標識 伏伐,以后的增刪改查都依賴這個_id
作為唯一標示宠进,這里是Elasticsearch幫我們隨機生成的id。
4.2 查看單個文檔
語法:
GET /索引名稱/_doc/{id}
示例:
GET /demo-index/_doc/1
文檔元數(shù)據(jù)說明
元數(shù)據(jù)項 | 含義 |
---|---|
_index | document所屬index |
_type | document所屬type藐翎,Elasticsearch7.x默認type為_doc |
_id | 代表document的唯一標識材蹬,與index和type一起实幕,可以唯一標識和定位一個document |
_version | document的版本號,Elasticsearch利用_version (版本號)的方式來確保應用中相互沖突的變更不會導致數(shù)據(jù)丟失堤器。需要修改數(shù)據(jù)時昆庇,需要指定想要修改文檔的version號,如果該版本不是當前版本號吼旧,請求將會失敗 |
_seq_no | 嚴格遞增的順序號凰锡,每個文檔一個,Shard級別嚴格遞增圈暗,保證后寫入的Doc seq_no大于先寫入的Doc的seq_no |
_primary_term | 任何類型的寫操作掂为,包括index、create员串、update和Delete勇哗,都會生成一個_primary_term |
found | true/false,是否查找到文檔 |
_source | 存儲原始文檔 |
4.3 查看所有文檔
語法:
POST /索引名稱/_search
{
"query": {
"match_all": {}
}
}
示例:
POST /demo-index/_search
{
"query": {
"match_all": {}
}
}
4.4 _source定制返回結(jié)果
某些業(yè)務場景下寸齐,我們不需要搜索引擎返回source中的所有字段欲诺,可以使用source進行定制,如下渺鹦,多個字段之間使用逗號分隔
語法:
GET /索引名稱/_doc/{id}?_source=field1,field2
示例:
GET /demo-index/_doc/1?_source=name,job
4.5 更新文檔
4.5.1 全部更新
把剛才新增的請求方式改為PUT扰法,就是修改了,不過修改必須指定id
id對應文檔存在毅厚,則修改
id對應文檔不存在塞颁,則新增
比如,我們把使用id為3吸耿,不存在祠锣,則應該是新增
示例:
PUT /demo-index/_doc/3
{
"name": "網(wǎng)易",
"job": "算法工程師",
"payment": "30000.0"
}
可以看到是 ``created`,是新增咽安。
我們再次執(zhí)行剛才的請求伴网,同時修改一下數(shù)據(jù)
可以看到結(jié)果是: updated
,顯然是更新數(shù)據(jù)
4.5.1 局部更新
Elasticsearch可以使用PUT或者POST對文檔進行更新(全部更新)妆棒,如果指定ID的文檔已經(jīng)存在澡腾,則執(zhí)行更新操作。
注意:Elasticsearch執(zhí)行更新操作的時候糕珊,Elasticsearch首先將舊的文檔標記為刪除狀態(tài)蛋铆,然后添加新的文檔,舊的文檔不會立即消失放接,但是你也無法訪問刺啦,Elasticsearch會在你繼續(xù)添加更多數(shù)據(jù)的時候在后臺清理已經(jīng)標記為刪除狀態(tài)的文檔。
全部更新纠脾,是直接把之前的老數(shù)據(jù)玛瘸,標記為刪除狀態(tài)蜕青,然后,再添加一條更新的(使用PUT或者POST)
局域更新糊渊,只是修改某個字段(使用POST)
語法:
POST /索引名/_update/{id}
{
"doc":{
"field":"value"
}
}
示例:
PUT /demo-index/_doc/3
{
"doc":{
"payment": "50000.0"
}
}
4.6 刪除文檔
4.6.1 根據(jù)id進行刪除
語法:
DELETE /索引名/_doc/{id}
示例:
DELETE /demo-index/_doc/3
可以看到結(jié)果是: deleted
右核,顯然是刪除數(shù)據(jù)
4.6.2 根據(jù)查詢條件進行刪除
語法:
POST /索引庫名/_delete_by_query
{
"query": {
"match": {
"字段名": "搜索關鍵字"
}
}
}
示例:
POST /demo-index/_delete_by_query
{
"query": {
"match": {
"name": "百度"
}
}
}
4.6.3 刪除所有文檔
語法:
POST /索引名/_delete_by_query
{
"query": {
"match_all": {}
}
}
示例:
POST /demo-index/_delete_by_query
{
"query": {
"match_all": {}
}
}
4.7 文檔的全量替換、強制創(chuàng)建
-
全量替換
語法與創(chuàng)建文檔是一樣的渺绒,如果文檔id不存在贺喝,那么就是創(chuàng)建;如果文檔id已經(jīng)存在宗兼,那么就是全量替換操作躏鱼,替換文檔的json串內(nèi)容场勤;
文檔是不可變的蘑险,如果要修改文檔的內(nèi)容,第一種方式就是全量替換毁兆,直接對文檔重新建立索引主到,替換里面所有的內(nèi)容茶行,elasticsearch會將老的文檔標記為deleted,然后新增我們給定的一個文檔登钥,當我們創(chuàng)建越來越多的文檔的時候畔师,elasticsearch會在適當?shù)臅r機在后臺自動刪除標記為deleted的文檔
-
強制創(chuàng)建
語法:
PUT /index/_doc/{id}?op_type=create {},PUT /index/_doc/{id}/_create {}
如果id 存在就會報錯