3 ES快速入門
ES作為一個索引及搜尋服務,對外提供豐富的REST接口,快速入門部分的執行個體使用head插件來測試,目的是對ES的使用方法及流程有個初步的認識。
3.1 建立索引庫
ES的索引庫是一個邏輯概念,它包括了分詞清單及文檔清單,同一個索引庫中存儲了相同類型的文檔。它就相當于MySQL中的表,或相當于Mongodb中的集合。
關于索引這個語:
索引(名詞):ES是基于Lucene建構的一個搜尋服務,它要從索引庫搜尋符合條件索引資料。
索引(動詞):索引庫剛建立起來是空的,将資料添加到索引庫的過程稱為索引。
下邊介紹兩種建立索引庫的方法,它們的工作原理是相同的,都是用戶端向ES服務發送指令。
1)使用postman或curl這樣的工具建立:
put http://localhost:9200/索引庫名稱
{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
number_of_shards:設定分片的數量,在叢集中通常設定多個分片,表示一個索引庫将拆分成多片分别存儲不同的結點,提高了ES的處理能力和高可用性,入門程式使用單機環境,這裡設定為1。
number_of_replicas:設定副本的數量,設定副本是為了提高ES的高可靠性,單機環境設定為0.
如下是建立的例子,建立xc_course索引庫,共1個分片,0個副本:
- 使用head插件建立
image.png

image.png
3.2 建立映射
3.2.1 概念說明
在索引中每個文檔都包括了一個或多個field,建立映射就是向索引庫中建立field的過程,下邊是document和field與關系資料庫的概念的類比:
文檔(Document)----------------Row記錄
字段(Field)-------------------Columns 列
注意:6.0之前的版本有type(類型)概念,type相當于關系資料庫的表,ES官方将在ES9.0版本中徹底删除type。
上邊講的建立索引庫相當于關系資料庫中的資料庫還是表?
1、如果相當于資料庫就表示一個索引庫可以建立很多不同類型的文檔,這在ES中也是允許的。
2、如果相當于表就表示一個索引庫隻能存儲相同類型的文檔,ES官方建議 在一個索引庫中隻存儲相同類型的文檔。
3.2.2 建立映射
我們要把資訊存儲到ES中,這裡我們建立資訊的映射,先來一個簡單的映射,如下:
發送:post http://localhost:9200/索引庫名稱/類型名稱/_mapping
建立類型為xc_course的映射,共包括三個字段:name、description、studymondel
由于ES6.0版本還沒有将type徹底删除,是以暫時把type起一個沒有特殊意義的名字。
post 請求:http://localhost:9200/xc_course/doc/_mapping 表示:在xc_course索引庫下的doc類型下建立映射。doc是類型名,可以自定義,在ES6.0中要弱化類型的概念,給它起一個沒有具體業務意義的名稱。
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
映射建立成功,檢視head界面:
image.png
3.3 建立文檔
ES中的文檔相當于MySQL資料庫表中的記錄。
發送:put 或Post http://localhost:9200/xc_course/doc/id值
(如果不指定id值ES會自動生成ID)
http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000
{
"name":"Bootstrap開發架構",
"description":"Bootstrap是由Twitter推出的一個前台頁面開發架構,在行業之中使用較為廣泛。此開發架構包含了大量的CSS、JS程式代碼,可以幫助開發者(尤其是不擅長頁面開發的程式人員)輕松的實作一個不受浏覽器限制的精美界面效果。",
"studymodel":"201001"
}
使用postman測試:
image.png
通過head查詢資料:
image.png
3.4 搜尋文檔
1、根據課程id查詢文檔
發送:get http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000 使用postman測試:
image.png
2、查詢所有記錄
發送 get http://localhost:9200/xc_course/doc/_search 3、查詢名稱中包括spring 關鍵字的的記錄
發送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap 4、查詢學習模式為201001的記錄
發送 get http://localhost:9200/xc_course/doc/_search?q=studymodel:201001
3.4.1查詢結果分析
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "xc_course",
"_type": "doc",
"_id": "4028e58161bcf7f40161bcf8b77c0000",
"_score": 1,
"_source": {
"name": "Bootstrap開發架構",
"description": "Bootstrap是由Twitter推出的一個前台頁面開發架構,在行業之中使用較為廣泛。此開發架構包含了大量的CSS、JS程式代碼,可以幫助開發者(尤其是不擅長頁面開發的程式人員)輕松的實作一個不受浏覽器限制的精美界面效果。",
"studymodel": "201001"
}
}
]
}
}
took:本次操作花費的時間,機關為毫秒。
timed_out:請求是否逾時
_shards:說明本次操作共搜尋了哪些分片
hits:搜尋命中的記錄
hits.total : 符合條件的文檔總數 hits.hits :比對度較高的前N個文檔
hits.max_score:文檔比對得分,這裡為最高分
_score:每個文檔都有一個比對度得分,按照降序排列。
_source:顯示了文檔的原始内容。
4 IK分詞器
4.1測試分詞器
在添加文檔時會進行分詞,索引中存放的就是一個一個的詞(term),當你去搜尋時就是拿關鍵字去比對詞,最終找到詞關聯的文檔。
測試目前索引庫使用的分詞器:
post 發送:localhost:9200/_analyze
{"text":"測試分詞器,後邊是測試内容:spring cloud實戰"}
結果如下:
image.png
會發現分詞的效果将 “測試” 這個詞拆分成兩個單字“測”和“試”,這是因為目前索引庫使用的分詞器對中文就是單字分詞。
4.2 安裝IK分詞器
使用IK分詞器可以實作對中文分詞的效果。
下載下傳IK分詞器:(Github位址:https://github.com/medcl/elasticsearch-analysis-ik)
下載下傳zip:解壓,并将解壓的檔案拷貝到ES安裝目錄的plugins下的ik目錄下
image.png
測試分詞效果:
發送:post localhost:9200/_analyze
{"text":"測試分詞器,後邊是測試内容:spring cloud實戰","analyzer":"ik_max_word" }
image.png
4.3 兩種分詞模式
ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。
1、ik_max_word
會将文本做最細粒度的拆分,比如會将“中華人民共和國人民大會堂”拆分為“中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。
2、ik_smart
會做最粗粒度的拆分,比如會将“中華人民共和國人民大會堂”拆分為中華人民共和國、人民大會堂。
4.4 自定義詞庫
如果要讓分詞器支援一些專有詞語,可以自定義詞庫。
iK分詞器自帶一個main.dic的檔案,此檔案為詞庫檔案。
image.png
打開IKAnalyzer.cfg.xml配置一下
image.png
在上邊的目錄中建立一個my.dic檔案(注意檔案格式為utf-8(不要選擇utf-8 BOM))
可以在其中自定義詞彙:
比如定義:
image.png
重新開機ES,測試分詞效果:
發送:post localhost:9200/_analyze
image.png
6 映射類型
6.1 映射維護方法
1、查詢所有索引的映射:
GET: http://localhost:9200/_mapping 2、建立映射
post 請求:http://localhost:9200/xc_course/doc/_mapping 一個例子:
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
3、更新映射
映射建立成功可以添加新字段,已有字段不允許更新。
4、删除映射
通過删除索引來删除映射。
6.2 常用映射類型
6.2.1 text文本字段
字元串包括text和keyword兩種類型:
1、text
1)analyzer
通過analyzer屬性指定分詞器。
下邊指定name的字段類型為text,使用ik分詞器的ik_max_word分詞模式。
"name": {
"type": "text",
"analyzer":"ik_max_word"
}
上邊指定了analyzer是指在索引和搜尋都使用ik_max_word,如果單獨想定義搜尋時使用的分詞器則可以通過search_analyzer屬性。
對于ik分詞器建議是索引時使用ik_max_word将搜尋内容進行細粒度分詞,搜尋時使用ik_smart提高搜尋精确性
"name": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
}
2)index
通過index屬性指定是否索引。
預設為index=true,即要進行索引,隻有進行索引才可以從索引庫搜尋到。
但是也有一些内容不需要索引,比如:商品圖檔位址隻被用來展示圖檔,不進行搜尋圖檔,此時可以将index設定
為false。
删除索引,重新建立映射,将pic的index設定為false,嘗試根據pic去搜尋,結果搜尋不到資料
pic": {
"type": "text",
"index":false
}
3)store
是否在source之外存儲,每個文檔索引後會在 ES中儲存一份原始文檔,存放在"_source"中,一般情況下不需要設定store為true,因為在_source中已經有一份原始文檔了。
6.2.2 keyword關鍵字字段
上邊介紹的text文本字段在映射時要設定分詞器,keyword字段為關鍵字字段,通常搜尋keyword是按照整體搜尋,是以建立keyword字段的索引時是不進行分詞的,比如:郵政編碼、手機号碼、身份證等。keyword字段通常用于過慮、排序、聚合等。
6.2.3 date日期類型
日期類型不用設定分詞器。
通常日期類型的字段用于排序。
1)format
通過format設定日期格式
例子:
下邊的設定允許date字段存儲年月日時分秒、年月日及毫秒三種格式。
{
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd"
}
}
}
6.2.4 數值類型
下邊是ES支援的數值類型
1、盡量選擇範圍小的類型,提高搜尋效率
2、對于浮點數盡量用比例因子,比如一個價格字段,機關為元,我們将比例因子設定為100這在ES中會按 分 存儲,映射如下:
"price": {
"type": "scaled_float",
"scaling_factor": 100
}