Elasticsearch 之入門使用

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
image-20210708094157472.png

2.2 判斷索引是否存在

語法:

HEAD /索引名稱      

示例:

HEAD /demo-index
image-20210708094426236.png

2.3 查看索引

get 請求可以幫我們查看索引的相關屬性信息烤蜕。

2.3.1 查看單個索引

語法:

GET /索引名稱

示例:

GET /demo-index
image-20210708094640520.png
2.3.2 批量查詢索引

語法:

GET /索引名稱1,索引名稱2,索引名稱3,...

示例:

GET /demo-index,demo-index1
image-20210708095432778.png
2.3.3 查看所有索引

語法:

方式一

GET _all
image-20210708095703697.png

方式二:

GET /_cat/indices?v
image-20210708095716199.png

綠色:索引的所有分片都正常分配封孙。

黃色:至少有一個副本沒有得到正確的分配。

紅色:至少有一個主分片沒有得到正確的分配讽营。

2.3.4 打開索引

語法:

POST /索引名稱/_open
image-20210708100051877.png
2.3.5 關閉索引

語法:

POST /索引名稱/_close
image-20210708100125032.png
2.3.6 刪除索引

語法:

DELETE /索引名稱1,索引名稱2,索引名稱3...

示例:

DELETE /demo-index1
image-20210708100201030.png

再次查看虎忌,返回索引不存在

image-20210708100254168.png

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"
    }
  }
}
image-20210708103504122.png

上述案例中,就是給 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

image-20210708103751027.png
  • 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_wordik_smart

3.3 查看映射關系

3.3.1 查看單個索引映射關系

語法:

GET /索引名稱/_mapping

示例:

GET /demo-index/_mapping
image-20210708104946037.png
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"
}
image-20210708110152390.png
4.1.2 自動生成id

語法:

POST /索引名稱/_doc
{
    "field1": "value1",
    "field2": "value2"
}

示例:

POST /demo-index/_doc
{
  "name": "百度",
  "job": "算法工程師",
  "payment": "30000.0"
}
image-20210708110338242.png

可以看到結(jié)果顯示為: created 勘天,代表創(chuàng)建成功。

另外捉邢,需要注意的是脯丝,在響應結(jié)果中有個 _id 字段,這個就是這條文檔數(shù)據(jù)的 唯一標識 伏伐,以后的增刪改查都依賴這個_id作為唯一標示宠进,這里是Elasticsearch幫我們隨機生成的id。

4.2 查看單個文檔

語法:

GET /索引名稱/_doc/{id}

示例:

GET /demo-index/_doc/1
image-20210708110619314.png

文檔元數(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": {}
  }
}

image-20210708111108074.png

4.4 _source定制返回結(jié)果

某些業(yè)務場景下寸齐,我們不需要搜索引擎返回source中的所有字段欲诺,可以使用source進行定制,如下渺鹦,多個字段之間使用逗號分隔

語法:

GET /索引名稱/_doc/{id}?_source=field1,field2

示例:

GET /demo-index/_doc/1?_source=name,job
image-20210708111346776.png

4.5 更新文檔

4.5.1 全部更新

把剛才新增的請求方式改為PUT扰法,就是修改了,不過修改必須指定id

  • id對應文檔存在毅厚,則修改

  • id對應文檔不存在塞颁,則新增

比如,我們把使用id為3吸耿,不存在祠锣,則應該是新增

示例:

PUT /demo-index/_doc/3
{
  "name": "網(wǎng)易",
  "job": "算法工程師",
  "payment": "30000.0"
}
image-20210708111706889.png

可以看到是 ``created`,是新增咽安。

我們再次執(zhí)行剛才的請求伴网,同時修改一下數(shù)據(jù)

image-20210708111842200.png

可以看到結(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"
    } 
}
image-20210708112116082.png

4.6 刪除文檔

4.6.1 根據(jù)id進行刪除

語法:

DELETE /索引名/_doc/{id}

示例:

DELETE /demo-index/_doc/3
image-20210708112253696.png

可以看到結(jié)果是: deleted 右核,顯然是刪除數(shù)據(jù)

4.6.2 根據(jù)查詢條件進行刪除

語法:

POST /索引庫名/_delete_by_query
{
  "query": {
    "match": {
      "字段名": "搜索關鍵字"
    }
  }
}

示例:

POST /demo-index/_delete_by_query
{
  "query": {
    "match": {
      "name": "百度"
    }
  }
}
image-20210708112529072.png
4.6.3 刪除所有文檔

語法:

POST /索引名/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}

示例:

POST /demo-index/_delete_by_query
{
  "query": {
    "match_all": {}
  }
}
image-20210708112728064.png

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 {}
    
image-20210708113947231.png

如果id 存在就會報錯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牧牢,一起剝皮案震驚了整個濱河市看锉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌结执,老刑警劉巖度陆,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾凯,死亡現(xiàn)場離奇詭異献幔,居然都是意外死亡,警方通過查閱死者的電腦和手機趾诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門蜡感,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恃泪,你說我怎么就攤上這事郑兴。” “怎么了贝乎?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵情连,是天一觀的道長。 經(jīng)常有香客問我览效,道長却舀,這世上最難降的妖魔是什么虫几? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮挽拔,結(jié)果婚禮上辆脸,老公的妹妹穿的比我還像新娘。我一直安慰自己螃诅,他們只是感情好啡氢,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著术裸,像睡著了一般倘是。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穗椅,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天辨绊,我揣著相機與錄音,去河邊找鬼匹表。 笑死门坷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的袍镀。 我是一名探鬼主播默蚌,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苇羡!你這毒婦竟也來了绸吸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤设江,失蹤者是張志新(化名)和其女友劉穎锦茁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叉存,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡码俩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了歼捏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿存。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞳秽,靈堂內(nèi)的尸體忽然破棺而出瓣履,到底是詐尸還是另有隱情,我是刑警寧澤练俐,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布袖迎,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏燕锥。R本人自食惡果不足惜浴韭,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脯宿。 院中可真熱鬧念颈,春花似錦、人聲如沸连霉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺撼。三九已至窟感,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歉井,已是汗流浹背柿祈。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哩至,地道東北人躏嚎。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像菩貌,于是被迫代替她去往敵國和親卢佣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容