- Elasticsearch作為一門全文檢索技術(shù),那它是如何使用的呢?
- 先學(xué)習(xí)Elasticsearch的一些語法,后續(xù)再在項(xiàng)目中實(shí)戰(zhàn)應(yīng)用。
一、IK分詞器
這個(gè)IK分詞器有什么用?為什么要用它?
要知道計(jì)算機(jī)是老美搞出來的,它的很多東西對(duì)于中文來說其實(shí)是很不友好的。
關(guān)于分詞,即把一段中文或者別的劃分成一個(gè)個(gè)的關(guān)鍵字。
比如"我是中國人",可以分為多少個(gè)詞?
按照中國漢字語言,其分為“我”,“是”,“中國人”,“中國”,“國人”這5個(gè)。
也就是說用戶輸入上述5個(gè)詞語,都可以搜索到“我是中國人”這條數(shù)據(jù)。
而默認(rèn)的中文分詞是將每個(gè)字看成一個(gè)詞,會(huì)被分為“我”,“是”,"中","國","人"。
這顯然是不符合要求的,所以用中文分詞器ik來解決這個(gè)問題。
①analyze:翻譯過來就是分析的意思,這里就可以理解成分詞。
②analyzer:這里也就是指分詞器,我們使用ik_max_word。
- ik_max_word為最細(xì)粒度劃分。
- ik_smart為最少切分。
這是ik分詞器提供的兩個(gè)分詞算法,至于具體是如何實(shí)現(xiàn)的,就要去研究它的算法了。
可以把上述代碼修改做一個(gè)對(duì)比,會(huì)發(fā)現(xiàn)使用ik_smart只能分三個(gè)詞:“我”,“是”,“中國人”
這里顯然使用ik_max_word更加的合適。
二、基本概念
Elasticsearch本質(zhì)上也就是在存儲(chǔ)數(shù)據(jù),其有很多概念可以和MySQL類似的。
為了方便學(xué)習(xí)將其和MySQL結(jié)合起來。
當(dāng)然嚴(yán)格來說將這些概念對(duì)應(yīng)起來不太準(zhǔn)確,但目前就這樣理解也沒問題。
①索引庫indices
- MySQL中通過數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)。
- Elasticsearch中通過索引庫存儲(chǔ)索引。
indices本身也就是索引indexs的復(fù)數(shù)寫法。
②類型type
- 一個(gè)數(shù)據(jù)庫中可以創(chuàng)建多張表,比如說商品表,訂單表。
- 一個(gè)索引集也可以有不同類型的索引,比如說商品索引,訂單索引。
不過這有一個(gè)缺陷是會(huì)導(dǎo)致索引庫混亂,未來版本中會(huì)移除這個(gè)概念,emm…也不知道現(xiàn)在移除這個(gè)概念沒有,目前還沒來得及查。
③文檔document
- 數(shù)據(jù)庫中一條數(shù)據(jù)就是一行。
- 索引集中一條信息就是一個(gè)文檔
④字段field
- 數(shù)據(jù)庫中列就是每一行中的數(shù)據(jù)。
- 索引集中字段就是文檔中的屬性。
弄清楚了這些概念,接下來創(chuàng)建索引庫。
三、操作索引庫
昨天我們也說明過了,Elasticsearch是一個(gè)基于RESTful風(fēng)格的搜索引擎。
Elasticsearch采用的是REST風(fēng)格API,其API本質(zhì)上也就是一次http請(qǐng)求:
1索引庫的創(chuàng)建
既然是請(qǐng)求,那自然就會(huì)有:
- 請(qǐng)求方式:PUT,其對(duì)應(yīng)的就是創(chuàng)建。
- 請(qǐng)求路徑:/索引庫名
- 請(qǐng)求參數(shù):這里是settings
這里settings是指索引庫的設(shè)置:
- number_of_shards:分片數(shù)量。
- number_of_rplicas:副本數(shù)量。
這個(gè)呢就涉及到了一些集群相關(guān)的概念,后續(xù)具體使用到的時(shí)候再做說明。
2索引庫的查詢與刪除
REST風(fēng)格的方便之處就在于通過請(qǐng)求方式的不同就能實(shí)現(xiàn)不同的操作:
①查詢索引庫
請(qǐng)求方式GET對(duì)應(yīng)的就是查詢操作。
請(qǐng)求路徑依舊是上述創(chuàng)建的索引庫,可以查詢出liuxiaoai01索引庫的信息。
②刪除索引庫
請(qǐng)求方式DELETE對(duì)應(yīng)的就是刪除操作。
請(qǐng)求路徑依舊是上述創(chuàng)建的索引庫,可以刪除liuxiaoai01索引庫。
刪除后再次使用GET查詢對(duì)應(yīng)的索引庫,會(huì)發(fā)現(xiàn)其會(huì)報(bào)錯(cuò)了,證明刪除成功。
四、操作字段映射
創(chuàng)建了索引庫也就相當(dāng)于有了database數(shù)據(jù)庫,接下來就是數(shù)據(jù)表并添加數(shù)據(jù)了。
1類型的創(chuàng)建
在索引庫中添加數(shù)據(jù)叫映射,這也是上述格式中_mApping的由來。
goods就是索引類型,也就是相當(dāng)于數(shù)據(jù)庫中的goods數(shù)據(jù)表。
properties也就是屬性,其下添加對(duì)應(yīng)的字段,上述中就有title,images,price三個(gè)字段,可以設(shè)置許多屬性:
- type:int、long、short、date、integer、text、string……等多個(gè)。
- index:根據(jù)語義理解就是是否被作為索引?
- analyzer:也就是分詞器。
這個(gè)type是字段數(shù)據(jù)類型:int、long這些是數(shù)字類型,text、string是字符串類型。
- 若是text類型,默認(rèn)會(huì)分詞。
- 若是String類型,默認(rèn)不會(huì)分詞,上述中寫的keyword和String一回事,翻譯過來是關(guān)鍵字的意思,關(guān)鍵字肯定不能再分了,更好理解。
2類型的查詢
PUT對(duì)應(yīng)著新增操作,GET也就對(duì)應(yīng)著查詢操作了,關(guān)于類型沒有刪除和修改操作。
就相當(dāng)于不能刪除和修改數(shù)據(jù)表的名稱,這點(diǎn)倒是和MySQL數(shù)據(jù)庫不一樣。
其查詢到的索引之間的映射關(guān)系也很清楚:
索引庫叫l(wèi)iuxiaoai01,通過mappings映射有g(shù)oods這個(gè)索引類型,該類型下properties中有3個(gè)字段。
基本上知道了其單詞意思也就知道其作用了。
注意關(guān)于這個(gè)type不要弄混了:
- goods對(duì)應(yīng)的是索引類型,相當(dāng)于數(shù)據(jù)表。
- 上述多個(gè)類型對(duì)應(yīng)的是字段的數(shù)據(jù)類型。
最后
行有不得反求諸己,我是@劉小愛