建立索引庫spring
ES的索引庫是一個邏輯概念,它包括了分詞列表及文檔列表,同一個索引庫中存儲了相同類型的文檔。它就至關於MySQL中的表,或至關於Mongodb中的集合。數據庫
關於索引這個語:bootstrap
索引(名詞):ES是基於Lucene構建的一個搜索服務,它要從索引庫搜索符合條件索引數據。瀏覽器
索引(動詞):索引庫剛建立起來是空的,將數據添加到索引庫的過程稱爲索引。app
下邊介紹兩種建立索引庫的方法,它們的工做原理是相同的,都是客戶端向ES服務發送命令。框架
put http://localhost:9200/索引庫名稱 建立post
{ "settings":{ "index":{ "number_of_shards":1, "number_of_replicas":0 } } }
number_of_shards:設置分片的數量,在集羣中一般設置多個分片,表示一個索引庫將拆分紅多片分別存儲不一樣的結點,提升了ES的處理能力和高可用性,入門程序使用單機環境,這裏設置爲1。學習
number_of_replicas:設置副本的數量,設置副本是爲了提升ES的高可靠性,單機環境設置爲0.測試
例如 建立xc_course索引庫,共1個分片,0個副本:spa
或者使用head插件建立
結果:
建立映射
在索引中每一個文檔都包括了一個或多個field,建立映射就是向索引庫中建立field的過程,document和field與關係數據庫的概念的類比:
文檔(Document)----------------Row記錄
字段(Field)-------------------Columns 列
上邊講的建立索引庫至關於關係數據庫中的數據庫仍是表?
一、若是至關於數據庫就表示一個索引庫能夠建立不少不一樣類型的文檔,這在ES中也是容許的。
二、若是至關於表就表示一個索引庫只能存儲相同類型的文檔,ES官方建議 在一個索引庫中只存儲相同類型的文檔
POST建立
發送舉例:post http://localhost:9200/索引庫名稱/類型名稱/_mapping
建立類型爲xc_course的映射,共包括三個字段:name、description、studymondel
例如:
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界面:
建立文檔
至關於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推出的一個前臺頁面開發框架,在行業之中使用較爲普遍。此開發框架包 ", "studymodel": "201001" }
使用postman:
經過head查詢數據:
搜索文檔
根據id查詢文檔
發送:get http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000
使用postman測試:
查詢全部記錄
發送 get http://localhost:9200/xc_course/doc/_search
查詢名稱中包括spring 關鍵字的的記錄
發送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap
查詢學習模式爲201001的記錄
發送 get http://localhost:9200/xc_course/doc/_search?q=studymodel:201001
查詢結果:
{ "took": 1, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.2876821, "hits": [{ "_index": "xc_course", "_type": "doc", "_id": "4028e58161bcf7f40161bcf8b77c0000", "_score": 0.2876821, "_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:顯示了文檔的原始內容。
IK分詞器
在添加文檔時會進行分詞,索引中存放的就是一個一個的詞(term),當你去搜索時就是拿關鍵字去匹配詞,最終找到詞關聯的文檔。
測試當前索引庫使用的分詞器:
post 發送:localhost:9200/_analyze
{"text":"測試分詞器,後邊是測試內容:spring cloud實戰"}
結果以下:
會發現分詞的效果將 「測試」 這個詞拆分紅兩個單字「測」和「試」,這是由於當前索引庫使用的分詞器對中文就是單字分詞。
IK分詞器分詞效果
發送:post localhost:9200/_analyze
{"text":"測試分詞器,後邊是測試內容:spring cloud實戰","analyzer":"ik_max_word" }
結果:
兩種分詞模式
ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。
一、ik_max_word
會將文本作最細粒度的拆分,好比會將「中華人民共和國人民大會堂」拆分爲「中華人民共和國、中華人民、中華、
華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。
二、ik_smart
會作最粗粒度的拆分,好比會將「中華人民共和國人民大會堂」拆分爲中華人民共和國、人民大會堂。
自定義詞庫
若是要讓分詞器支持一些專有詞語,能夠自定義詞庫。
iK分詞器自帶一個main.dic的文件,此文件爲詞庫文件。
能夠進行該詞庫替換與配置加強功能