ElasticSearch快速入門(mén)【建議收藏】
鏈接上一篇文章 :深入淺出講解 ElasticSearch的安裝與使用【建議收藏】
3.ES快速入門(mén)
ES作為一個(gè)索引及搜索服務(wù),對(duì)外提供豐富的REST接口,快速入門(mén)部分的實(shí)例使用head插件來(lái)測(cè)試,目的是對(duì)ES的使用方法及流程有個(gè)初步的認(rèn)識(shí)。
3.1 創(chuàng)建索引庫(kù)
ES的索引庫(kù)是一個(gè)邏輯概念,它包括了分詞列表及文檔列表,同一個(gè)索引庫(kù)中存儲(chǔ)了相同類(lèi)型的文檔。它就相當(dāng)于MySQL中的表,或相當(dāng)于Mongodb中的集合。
關(guān)于索引這個(gè)語(yǔ):
索引(名詞):ES是基于Lucene構(gòu)建的一個(gè)搜索服務(wù),它要從索引庫(kù)搜索符合條件索引數(shù)據(jù)。
索引(動(dòng)詞):索引庫(kù)剛創(chuàng)建起來(lái)是空的,將數(shù)據(jù)添加到索引庫(kù)的過(guò)程稱(chēng)為索引。
下邊介紹兩種創(chuàng)建索引庫(kù)的方法,它們的工作原理是相同的,都是客戶(hù)端向ES服務(wù)發(fā)送命令。
1)使用postman或curl這樣的工具創(chuàng)建:
put http://localhost:9200/索引庫(kù)名稱(chēng){"settings":{"index":{"number_of_shards":1,"number_of_replicas":0}}}
number_of_shards:設(shè)置分片的數(shù)量,在集群中通常設(shè)置多個(gè)分片,表示一個(gè)索引庫(kù)將拆分成多片分別存儲(chǔ)不同的結(jié)點(diǎn),提高了ES的處理能力和高可用性,入門(mén)程序使用單機(jī)環(huán)境,這里設(shè)置為1。
number_of_replicas:設(shè)置副本的數(shù)量,設(shè)置副本是為了提高ES的高可靠性,單機(jī)環(huán)境設(shè)置為0.
如下是創(chuàng)建的例子,創(chuàng)建xc_course索引庫(kù),共1個(gè)分片,0個(gè)副本:
使用head插件創(chuàng)建


3.2 創(chuàng)建映射
3.2.1 概念說(shuō)明
在索引中每個(gè)文檔都包括了一個(gè)或多個(gè)field,創(chuàng)建映射就是向索引庫(kù)中創(chuàng)建field的過(guò)程,下邊是document和field與關(guān)系數(shù)據(jù)庫(kù)的概念的類(lèi)比:
文檔(Document)----------------Row記錄
字段(Field)-------------------Columns 列
注意:6.0之前的版本有type(類(lèi)型)概念,type相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)的表,ES官方將在ES9.0版本中徹底刪除type。
上邊講的創(chuàng)建索引庫(kù)相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)還是表?
1、如果相當(dāng)于數(shù)據(jù)庫(kù)就表示一個(gè)索引庫(kù)可以創(chuàng)建很多不同類(lèi)型的文檔,這在ES中也是允許的。
2、如果相當(dāng)于表就表示一個(gè)索引庫(kù)只能存儲(chǔ)相同類(lèi)型的文檔,ES官方建議 在一個(gè)索引庫(kù)中只存儲(chǔ)相同類(lèi)型的文檔。
3.2.2 創(chuàng)建映射
我們要把信息存儲(chǔ)到ES中,這里我們創(chuàng)建信息的映射,先來(lái)一個(gè)簡(jiǎn)單的映射,如下:
發(fā)送:post http://localhost:9200/索引庫(kù)名稱(chēng)/類(lèi)型名稱(chēng)/_mapping創(chuàng)建類(lèi)型為xc_course的映射,共包括三個(gè)字段:name、description、studymondel
由于ES6.0版本還沒(méi)有將type徹底刪除,所以暫時(shí)把type起一個(gè)沒(méi)有特殊意義的名字。
post 請(qǐng)求:http://localhost:9200/xc_course/doc/_mapping表示:在xc_course索引庫(kù)下的doc類(lèi)型下創(chuàng)建映射。doc是類(lèi)型名,可以自定義,在ES6.0中要弱化類(lèi)型的概念,給它起一個(gè)沒(méi)有具體業(yè)務(wù)意義的名稱(chēng)。
{"properties":{"name":{"type":"text"},"description":{"type":"text"},"studymodel":{"type":"keyword"}}}
映射創(chuàng)建成功,查看head界面:

3.3 創(chuàng)建文檔
ES中的文檔相當(dāng)于MySQL數(shù)據(jù)庫(kù)表中的記錄。
發(fā)送:put 或Post http://localhost:9200/xc_course/doc/id值(如果不指定id值ES會(huì)自動(dòng)生成ID)
http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000{"name":"Bootstrap開(kāi)發(fā)框架","description":"Bootstrap是由Twitter推出的一個(gè)前臺(tái)頁(yè)面開(kāi)發(fā)框架,在行業(yè)之中使用較為廣泛。此開(kāi)發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開(kāi)發(fā)者(尤其是不擅長(zhǎng)頁(yè)面開(kāi)發(fā)的程序人員)輕松的實(shí)現(xiàn)一個(gè)不受瀏覽器限制的精美界面效果。","studymodel":"201001"}
使用postman測(cè)試:

通過(guò)head查詢(xún)數(shù)據(jù):

3.4 搜索文檔
1、根據(jù)課程id查詢(xún)文檔
發(fā)送:get http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000使用postman測(cè)試:

2、查詢(xún)所有記錄
發(fā)送 get http://localhost:9200/xc_course/doc/_search3、查詢(xún)名稱(chēng)中包括spring 關(guān)鍵字的的記錄
發(fā)送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap4、查詢(xún)學(xué)習(xí)模式為201001的記錄
發(fā)送 get http://localhost:9200/xc_course/doc/_search?q=studymodel:2010013.4.1查詢(xún)結(jié)果分析
{"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開(kāi)發(fā)框架","description": "Bootstrap是由Twitter推出的一個(gè)前臺(tái)頁(yè)面開(kāi)發(fā)框架,在行業(yè)之中使用較為廣泛。此開(kāi)發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開(kāi)發(fā)者(尤其是不擅長(zhǎng)頁(yè)面開(kāi)發(fā)的程序人員)輕松的實(shí)現(xiàn)一個(gè)不受瀏覽器限制的精美界面效果。","studymodel": "201001"}}]}}
took:本次操作花費(fèi)的時(shí)間,單位為毫秒。
timed_out:請(qǐng)求是否超時(shí)
_shards:說(shuō)明本次操作共搜索了哪些分片
hits:搜索命中的記錄
hits.total :符合條件的文檔總數(shù) hits.hits :匹配度較高的前N個(gè)文檔
hits.max_score:文檔匹配得分,這里為最高分
_score:每個(gè)文檔都有一個(gè)匹配度得分,按照降序排列。
_source:顯示了文檔的原始內(nèi)容。
4 IK分詞器
4.1測(cè)試分詞器
在添加文檔時(shí)會(huì)進(jìn)行分詞,索引中存放的就是一個(gè)一個(gè)的詞(term),當(dāng)你去搜索時(shí)就是拿關(guān)鍵字去匹配詞,最終找到詞關(guān)聯(lián)的文檔。
測(cè)試當(dāng)前索引庫(kù)使用的分詞器:
post 發(fā)送:localhost:9200/_analyze{"text":"測(cè)試分詞器,后邊是測(cè)試內(nèi)容:spring cloud實(shí)戰(zhàn)"}結(jié)果如下:

會(huì)發(fā)現(xiàn)分詞的效果將 “測(cè)試” 這個(gè)詞拆分成兩個(gè)單字“測(cè)”和“試”,這是因?yàn)楫?dāng)前索引庫(kù)使用的分詞器對(duì)中文就是單字分詞。
4.2 安裝IK分詞器
使用IK分詞器可以實(shí)現(xiàn)對(duì)中文分詞的效果。
下載IK分詞器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)
下載zip:解壓,并將解壓的文件拷貝到ES安裝目錄的plugins下的ik目錄下

測(cè)試分詞效果:
發(fā)送:post localhost:9200/_analyze{"text":"測(cè)試分詞器,后邊是測(cè)試內(nèi)容:spring cloud實(shí)戰(zhàn)","analyzer":"ik_max_word" }
4.3 兩種分詞模式
ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。
1、ik_max_word
會(huì)將文本做最細(xì)粒度的拆分,比如會(huì)將“中華人民共和國(guó)人民大會(huì)堂”拆分為“中華人民共和國(guó)、中華人民、中華、華人、人民共和國(guó)、人民、共和國(guó)、大會(huì)堂、大會(huì)、會(huì)堂等詞語(yǔ)。
2、ik_smart
會(huì)做最粗粒度的拆分,比如會(huì)將“中華人民共和國(guó)人民大會(huì)堂”拆分為中華人民共和國(guó)、人民大會(huì)堂。
4.4 自定義詞庫(kù)
如果要讓分詞器支持一些專(zhuān)有詞語(yǔ),可以自定義詞庫(kù)。
iK分詞器自帶一個(gè)main.dic的文件,此文件為詞庫(kù)文件。

打開(kāi)IKAnalyzer.cfg.xml配置一下

在上邊的目錄中新建一個(gè)my.dic文件(注意文件格式為utf-8(不要選擇utf-8 BOM))
可以在其中自定義詞匯:
比如定義:

重啟ES,測(cè)試分詞效果:
發(fā)送:post localhost:9200/_analyze
6 映射類(lèi)型
6.1 映射維護(hù)方法
1、查詢(xún)所有索引的映射:
GET:http://localhost:9200/_mapping2、創(chuàng)建映射
post 請(qǐng)求:http://localhost:9200/xc_course/doc/_mapping一個(gè)例子:
{"properties": {"name": {"type": "text"},"description": {"type": "text"},"studymodel": {"type": "keyword"}}}
3、更新映射
映射創(chuàng)建成功可以添加新字段,已有字段不允許更新。
4、刪除映射
通過(guò)刪除索引來(lái)刪除映射。
6.2 常用映射類(lèi)型
6.2.1 text文本字段
字符串包括text和keyword兩種類(lèi)型:
1、text
1)analyzer
通過(guò)analyzer屬性指定分詞器。
下邊指定name的字段類(lèi)型為text,使用ik分詞器的ik_max_word分詞模式。
"name": {"type": "text","analyzer":"ik_max_word"}
上邊指定了analyzer是指在索引和搜索都使用ik_max_word,如果單獨(dú)想定義搜索時(shí)使用的分詞器則可以通過(guò)search_analyzer屬性。
"name": {"type": "text","analyzer":"ik_max_word","search_analyzer":"ik_smart"}
2)index
通過(guò)index屬性指定是否索引。
默認(rèn)為index=true,即要進(jìn)行索引,只有進(jìn)行索引才可以從索引庫(kù)搜索到。
但是也有一些內(nèi)容不需要索引,比如:商品圖片地址只被用來(lái)展示圖片,不進(jìn)行搜索圖片,此時(shí)可以將index設(shè)置
為false。
刪除索引,重新創(chuàng)建映射,將pic的index設(shè)置為false,嘗試根據(jù)pic去搜索,結(jié)果搜索不到數(shù)據(jù)
pic": {"type": "text","index":false}
3)store
是否在source之外存儲(chǔ),每個(gè)文檔索引后會(huì)在 ES中保存一份原始文檔,存放在"_source"中,一般情況下不需要設(shè)置store為true,因?yàn)樵赺source中已經(jīng)有一份原始文檔了。
6.2.2 keyword關(guān)鍵字字段
上邊介紹的text文本字段在映射時(shí)要設(shè)置分詞器,keyword字段為關(guān)鍵字字段,通常搜索keyword是按照整體搜索,所以創(chuàng)建keyword字段的索引時(shí)是不進(jìn)行分詞的,比如:郵政編碼、手機(jī)號(hào)碼、身份證等。keyword字段通常用于過(guò)慮、排序、聚合等。
6.2.3 date日期類(lèi)型
日期類(lèi)型不用設(shè)置分詞器。
通常日期類(lèi)型的字段用于排序。
1)format
通過(guò)format設(shè)置日期格式
例子:
下邊的設(shè)置允許date字段存儲(chǔ)年月日時(shí)分秒、年月日及毫秒三種格式。
{"properties":{"timestamp":{"type":"date","format":"yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd"}}}
6.2.4 數(shù)值類(lèi)型
下邊是ES支持的數(shù)值類(lèi)型
1、盡量選擇范圍小的類(lèi)型,提高搜索效率
2、對(duì)于浮點(diǎn)數(shù)盡量用比例因子,比如一個(gè)價(jià)格字段,單位為元,我們將比例因子設(shè)置為100這在ES中會(huì)按 分 存儲(chǔ),映射如下:
"price": {"type": "scaled_float","scaling_factor": 100}
由于比例因子為100,如果我們輸入的價(jià)格是23.45則ES中會(huì)將23.45乘以100存儲(chǔ)在ES中。
如果輸入的價(jià)格是23.456,ES會(huì)將23.456乘以100再取一個(gè)接近原始值的數(shù),得出2346。
使用比例因子的好處是整型比浮點(diǎn)型更易壓縮,節(jié)省磁盤(pán)空間。
總之一句話(huà),實(shí)踐出真知。在操作過(guò)程中遇到各種問(wèn)題解決問(wèn)題就對(duì)了。
