您好,登錄后才能下訂單哦!
這篇文章主要講解了“什么是ElasticSearch”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“什么是ElasticSearch”吧!
ElasticSearch的目標(biāo)就是實(shí)現(xiàn)搜索。在數(shù)據(jù)量少的時(shí)候,我們可以通過(guò)索引去搜索關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù),但是如果數(shù)據(jù)量很大,搜索的效率就會(huì)很低,這個(gè)時(shí)候我們就需要一種分布式的搜索引擎。Elasticsearch是一個(gè)基于Lucene的搜索服務(wù)器。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口。
ES主要用于全文檢索、結(jié)構(gòu)化搜索以及分析。ES的應(yīng)用十分廣泛,比如維基百科、Github等都使用ES實(shí)現(xiàn)搜索。
2.1 數(shù)據(jù)結(jié)構(gòu)
ES既然是用來(lái)搜索的,那么它必然也需要存儲(chǔ)數(shù)據(jù)。在Mysql等關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)的存儲(chǔ)遵循下面的邏輯:
一個(gè)數(shù)據(jù)庫(kù)(database)中有多個(gè)表(tables),每個(gè)表有多行數(shù)據(jù)(rows),每一行數(shù)據(jù)由多個(gè)字段(columns)組成。
ES中的存儲(chǔ)是這樣的:
一個(gè)索引(indeces)相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)(database),每個(gè)索引中有多個(gè)類(lèi)型types(相當(dāng)于表結(jié)構(gòu)),每個(gè)索引中有多個(gè)documents(相當(dāng)于行),每個(gè)documents由多個(gè)fields組成(相當(dāng)于字段)。
你可以把ES理解為他是一個(gè)面向文檔的數(shù)據(jù)庫(kù)。下面用一張圖描述ES和關(guān)系型數(shù)據(jù)庫(kù)之間的相似之處:
值得注意的是,在ES7.x版本中,types將慢慢被遺棄,在8.x版本中,types將會(huì)徹底棄用。
2.2 索引(indeces)和文檔(documents)
ES中的索引和Mysql中的索引不是同一種東西,ES中的索引是一個(gè)文檔的集合,索引就是一個(gè)數(shù)據(jù)庫(kù)。
前面說(shuō)了ES是面向文檔的,文檔是ES中最重要的單位,文檔就是一條條的數(shù)據(jù)。文檔中有幾個(gè)重要的概念:
1、一篇文檔中包含多個(gè)key:value
2、文檔其實(shí)就是一個(gè)JSON字符串
2.3 分片
ES是一個(gè)分布式搜索引擎,分片就是把一堆數(shù)據(jù)分布到多個(gè)分片中。而索引是對(duì)每個(gè)分片的一個(gè)備份,這些副本同樣能處理查詢請(qǐng)求。
現(xiàn)在假設(shè)集群有兩個(gè)node節(jié)點(diǎn),設(shè)置分片數(shù)是5個(gè),副本數(shù)是1個(gè),那么數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)將變成下面這樣,可以保證副本和分片在不同的節(jié)點(diǎn)上:
2.4 倒排索引
為什么ES的搜索這么快,和其中所使用的倒排索引也有一定的關(guān)系。倒排索引建立的是分詞和文檔之間的映射關(guān)系。下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)講解一下什么是倒排索引
原來(lái)的數(shù)據(jù)中我們通過(guò)文檔ID去關(guān)聯(lián)標(biāo)簽,但是在查詢時(shí)就需要遍歷所有文檔。通過(guò)倒排索引,我們可以通過(guò)關(guān)鍵詞來(lái)找到最匹配的文檔。
ES是基于Restful風(fēng)格進(jìn)行操作的,因此對(duì)于習(xí)慣了寫(xiě)crud的程序員來(lái)說(shuō),ES很容易上手。ES的操作可以使用Kibana,也可以使用Postman直接調(diào)用,因?yàn)闅w根結(jié)底它就是一個(gè)restful的操作。我這里使用Idea的ES插件直接調(diào)用。
3.1 創(chuàng)建文檔
PUT http://ip:port/索引名/類(lèi)型名/文檔id
{
"key":"value"
}
因?yàn)轭?lèi)型名在后續(xù)的版本中將會(huì)被刪除,這里可以用_doc代表默認(rèn)類(lèi)型:
PUT http://ip:port/索引名/_doc/文檔id
下面給出操作截圖
通過(guò)put創(chuàng)建一個(gè)索引之后,我們可以在head中看到對(duì)應(yīng)的數(shù)據(jù)
3.2 創(chuàng)建帶有數(shù)據(jù)類(lèi)型的索引
3.1中創(chuàng)建數(shù)據(jù)時(shí),沒(méi)有指定具體的數(shù)據(jù)類(lèi)型,我們當(dāng)然也可以為索引指定數(shù)據(jù)類(lèi)型
PUT http://ip:port/索引名
參數(shù)示例:
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "text"
}
}
}
}
ES中的核心數(shù)據(jù)類(lèi)型如下:
(1)字符串類(lèi)型: text, keyword
(2)數(shù)字類(lèi)型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 納秒:date_nanos
(5)布爾型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
3.3 查看索引或者文檔的數(shù)據(jù)
通過(guò)GET請(qǐng)求可以查看索引以及文檔的信息:
GET http://ip:port/索引名 #查看索引
GET http://ip:port/索引名/類(lèi)型名/文檔ID #查看文檔
3.4 修改數(shù)據(jù)
修改數(shù)據(jù)和創(chuàng)建數(shù)據(jù)一樣,通過(guò)PUT操作就會(huì)更新原來(lái)的數(shù)據(jù):
PUT http://ip:port/索引名/類(lèi)型名/文檔id
{
"key":"value"
}
如果是修改的話,響應(yīng)結(jié)果中的version就會(huì)增加。
另外一種方法是使用Post請(qǐng)求:
POST http://ip:port/索引名/類(lèi)型名/文檔id/_update
參數(shù)實(shí)例:
{
"doc": {
"name": "javayz4"
}
}
更推薦使用這種方式,如果使用PUT方法忘了加某個(gè)key,更新就會(huì)變成新增
3.5 刪除數(shù)據(jù)
通過(guò)DELETE的方式刪除數(shù)據(jù)
DELETE http://ip:port/索引名/類(lèi)型名/文檔id #刪除具體的文檔
DELETE http://ip:port/索引名 #刪除索引
ES最重要的就是它的搜索操作了。
4.1 簡(jiǎn)單搜索
直接將搜索的參數(shù)帶到鏈接中:
GET http://ip:port/索引名/_search?q=key:value
結(jié)果如下:
4.2 通過(guò)param傳遞參數(shù)
除了將參數(shù)放到鏈接當(dāng)中,還可以將參數(shù)通過(guò)JSON請(qǐng)求體的方式傳遞,其中from和size是分頁(yè)的參數(shù),query中傳遞查詢條件,_source表示結(jié)果中要展示的列,不寫(xiě)就表示展示所有。
GET http://ip:port/索引名/_search
參數(shù)示例:
{
"from": 0,
"size": 20,
"query": {
"match": {
"name": "javayz2"
}
},
"_source": ["name","address"]
}
除了上面示例中的這些參數(shù)之外,還有很多參數(shù)可以使用,比如排序:
"sort": [
{
"age": {
"order": "desc"
}
}
]
多條件查詢:must表示下面的兩個(gè)條件都要滿足,還可以填should,表示任意滿足其中一個(gè)條件即可,或者是must_not,表示must的相反值
"query": {
"bool": {
"must": [
{
"match": {
"name": "javayz"
}
},
{
"match": {
"address": "hz"
}
}
]
}
}
如果你的數(shù)據(jù)中存在集合,可以通過(guò)空格對(duì)多個(gè)條件進(jìn)行查詢:
查詢過(guò)程中還支持高亮查詢
"highlight":{
"pre_tags": "<em>",
"post_tags": "</em>",
"fields": {
"name": {}
}
}
所謂分詞器,就是將一段話分成一個(gè)個(gè)關(guān)鍵字,搜索時(shí)就按照這些關(guān)鍵字進(jìn)行搜索。比較好用的分詞器有中文的IK分詞器。
基本使用
給出下載鏈接:https://github.com/medcl/elasticsearch-analysis-ik/releases
下載和自己ES相同的版本,在plugin目錄下新建一個(gè)ik文件夾,將下載的文件解壓到ik目錄下,重新啟動(dòng)即可。
IK分詞器提供了兩種算法:
1、ik_smart:最少切分
2、ik_max_word:最細(xì)粒劃分
首先最少切分是根據(jù)字典給出最少的切分:
ik_max_word是最細(xì)粒劃分,他會(huì)給出最多的結(jié)果:
{
"analyzer": "ik_max_word",
"text": "我是Java工程師"
}
結(jié)果:
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "java",
"start_offset": 2,
"end_offset": 6,
"type": "ENGLISH",
"position": 2
},
{
"token": "工程師",
"start_offset": 6,
"end_offset": 9,
"type": "CN_WORD",
"position": 3
},
{
"token": "工程",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 4
},
{
"token": "師",
"start_offset": 8,
"end_offset": 9,
"type": "CN_CHAR",
"position": 5
}
]
}
感謝各位的閱讀,以上就是“什么是ElasticSearch”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)什么是ElasticSearch這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。