????????????
哈嘍!大家好,我是【一心同學】,一位上進心十足的【Java領域博主】!??????
?【一心同學】的寫作風格:喜歡用【通俗易懂】的文筆去講解每一個知識點,而不喜歡用【高大上】的官方陳述。
?【一心同學】博客的領域是【面向后端技術】的學習,未來會持續(xù)更新更多的【后端技術】以及【學習心得】。
?如果有對【后端技術】感興趣的【小可愛】,歡迎關注【一心同學】??????
??????感謝各位大可愛小可愛!???????
目錄
一、Rest風格是什么?
二、索引的基本操作
2.1 創(chuàng)建索引并添加數(shù)據(jù)
2.2 獲取規(guī)則
2.3 指定字段類型
2.4 刪除索引
三、文檔的基本操作
3.1 添加數(shù)據(jù)?
3.2 獲取數(shù)據(jù)?
3.3 更新數(shù)據(jù)
第一種:使用PUT
第二種:Post _update(推薦)
3.4 簡單查詢
四、search查詢操作
4.1? 條件查詢
4.2 模糊查詢
4.3 結果過濾
4.4? 排序
4.5?分頁
4.6 多條件查詢
???must
???should
???must_not(not)
4.7 過濾器
4.8?多條件查詢
?? 環(huán)境準備
?? 查詢
4.9 精確查詢
4.9.1 text與keyword
4.9.2 環(huán)境準備
4.9.3 查詢
4.10 多值匹配精確查詢
4.11 高亮
?? 默認樣式
?? 自定義高亮的樣式
小結
一、Rest風格是什么?
Rest風格是一種軟件架構風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制。
基本Rest命令:
method | url地址 | 描述 |
---|---|---|
PUT(創(chuàng)建,修改) | localhost:9200/索引名稱/類型名稱/文檔id | 創(chuàng)建文檔(指定文檔id) |
POST(創(chuàng)建) | localhost:9200/索引名稱/類型名稱 | 創(chuàng)建文檔(隨機文檔id) |
POST(修改) | localhost:9200/索引名稱/類型名稱/文檔id/_update | 修改文檔 |
DELETE(刪除) | localhost:9200/索引名稱/類型名稱/文檔id | 刪除文檔 |
GET(查詢) | localhost:9200/索引名稱/類型名稱/文檔id | 查詢文檔通過文檔ID |
POST(查詢) | localhost:9200/索引名稱/類型名稱/文檔id/_search | 查詢所有數(shù)據(jù) |
二、索引的基本操作
2.1 創(chuàng)建索引并添加數(shù)據(jù)
?語法:
PUT /索引名/類型名/文檔id
{
請求體
}
代碼:
PUT /yixin/user/1
{
"name":"一心",
"age":18
}
結果:
?這樣是創(chuàng)建成功的,但其提示告訴我們type 在未來的版本中會逐漸棄用,因此產(chǎn)生一個默認類型_doc?進行代替。
2.2 獲取規(guī)則
作用:通過 GET 可以請求獲取具體的信息,查看我們的索引信息。
語法:
GET 索引名
輸入:
GET yixin
結果:
可以發(fā)現(xiàn)如果我們在創(chuàng)建索引的時候,沒有指定字段類型,那么其會默認給我們的字段賦予類型的。
2.3 指定字段類型
作用:用來創(chuàng)建規(guī)則,類似于建庫(建立索引和字段對應類型),也可看做規(guī)則的建立。
常用的字段數(shù)據(jù)類型:
類型 | 屬性 |
字符串類型 | text:支持分詞,全文檢索,支持模糊、精確查詢,不支持聚合,排序操作;text類型的最大支持的字符長度無限制,適合大字段存儲; keyword:不進行分詞,直接索引、支持模糊、支持精確匹配,支持聚合、排序操作。keyword類型的最大支持的長度為——32766個UTF-8類型的字符,可以通過設置ignore_above指定自持字符長度,超過給定長度后的數(shù)據(jù)將不被索引,無法通過term精確匹配檢索返回結果。 |
數(shù)值型 | long、Integer、short、byte、double、float、half float、scaled float |
日期類型 | date |
布爾類型 | boolean |
二進制類型 | binary |
代碼:
PUT /test1
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
獲取規(guī)則:
?現(xiàn)在我們只需要根據(jù)對應的類型進行插入數(shù)據(jù)即可:
PUT /test1/_doc/1
{
"name":"一心",
"age":18,
"birthday":"2000-01-01"
}
2.4 刪除索引
語法:
DELETE /索引名
輸入:
DELETE /test1
注意:如果只是要刪除某一條文檔則是DELETE /test1/_doc/1。
三、文檔的基本操作
3.1 添加數(shù)據(jù)?
代碼:
PUT /yixin/user/1
{
"name":"yixin",
"age":18
}
查看索引的數(shù)據(jù):
3.2 獲取數(shù)據(jù)?
代碼:
GET yixin/user/1
結果:
3.3 更新數(shù)據(jù)
第一種:使用PUT
代碼:
PUT /yixin/user/2
{
"name":"一心同學",
"age":18
}
輸出:
分析:“version”代表這個數(shù)據(jù)被改動的次數(shù),每次執(zhí)行PUT,無論是否進行改動,verson值都會增加,而且如果PUT的文檔屬性沒有傳遞值,則會進行覆蓋操作。
第二種:Post _update(推薦)
代碼:
POST yixin/user/2/_update
{
"doc":{
"name":"一心呀"
}
}
輸出:
分析:“verson”同樣是指變動的次數(shù),如果多次執(zhí)行POST,但不修改,那么verson值不變,而且我們的字段沒有設置值不會進行覆蓋操作,靈活性高!
3.4 簡單查詢
需求:查詢某條數(shù)據(jù)。
GET yixin/user/1
輸出:
需求:查詢所有數(shù)據(jù)。
GET yixin/user/_search
輸出:
四、search查詢操作
4.1? 條件查詢
需求:查詢名字帶有“一心”并且年齡為18歲的用戶。
GET yixin/user/_search?q=name:"一心",age:18
輸出:
4.2 模糊查詢
關鍵字:match
需求:查詢命中帶有“一心”的用戶。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
}
}
輸出:
4.3 結果過濾
關鍵字:source
作用:如果我們不希望展示那么多信息,可以使用_source進行結果過濾。
需求:輸出的字段中,只顯示name。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"_source": ["name"]
}
輸出:
4.4? 排序
關鍵字:sort
- 降序:desc
- 升序:asc
需求:匹配帶有“一心”的名字,并且根據(jù)年齡進行降序排列。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
輸出:
4.5?分頁
關鍵詞:
from:從第幾個數(shù)據(jù)開始,下標從0開始。
size:單頁面返回多少條數(shù)據(jù)。
需求:匹配帶有“一心”的名字,并且按年齡進行降序,每一頁只顯示1條數(shù)據(jù),返回第一頁。
GET yixin/user/_search
{
"query": {
"match": {
"name": "一心"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 1
}
輸出:
4.6 多條件查詢
關鍵詞:
bool:布爾值查詢
must(and):所有的條件都要符合 where id=1 and name = xxx
should(or):所有的條件都要符合 where id=1 or name = xxx
must_not(not):非,不符合的條件
???must
需求:查詢名字帶有“一心”并且年齡為19的用戶。
GET yixin/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "一心"
}
},
{
"match": {
"age": "19"
}
}
]
}
}
}
輸出:
???should
需求:查詢名字帶有“一心”或“張”的用戶。
GET yixin/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "一心"
}
},
{
"match": {
"name": "張"
}
}
]
}
}
}
輸出:
???must_not(not)
需求:查詢年齡不是18歲的用戶。
GET yixin/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "18"
}
}
]
}
}
}
輸出:
4.7 過濾器
關鍵字:filter
- gt 大于
- gte 大于等于
- lt 小于
- lte 小于等于
需求1:查詢年齡小于20歲的用戶,但不能等于18歲。
GET yixin/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": "18"
}
}
],
"filter": {
"range": {
"age": {
"lt": 20
}
}
}
}
}
}
輸出:
需求2:查詢年齡為15-20歲之間的用戶。
GET yixin/user/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 15,
"lte": 20
}
}
}
}
}
}
輸出:
4.8?多條件查詢
?? 環(huán)境準備
PUT /yixin2/user/1
{
"name":"一心同學",
"age":18,
"tags":["技術","運動","社交"]
}
PUT /yixin2/user/2
{
"name":"張三",
"age":20,
"tags":["游戲","運動","喝咖啡"]
}
PUT /yixin2/user/3
{
"name":"李四",
"age":21,
"tags":["滑雪","技術"]
}
?? 查詢
需求:查詢標簽擁有“技術”或“運動”的用戶。
GET yixin2/user/_search
{
"query": {
"match": {
"tags": "技術 運動"
}
}
}
輸出:
4.9 精確查詢
關鍵詞:term
term: 精確查詢,對查詢的值不分詞,直接進倒排索引去匹配。
match; 模糊查詢,對查詢的值分詞,對分詞的結果一一進入倒排索引去匹配
4.9.1 text與keyword
text: 在寫入時,對寫入的值進行分詞,然后一一插入到倒排索引。
keyword: 在寫入時,將整個值插入到倒排索引中,不進行分詞。
對keyword進行查詢:
GET _analyze
{
"analyzer": "keyword",
"text": "你好,世界"
}
輸出:
可以發(fā)現(xiàn)不會對詞匯進行拆分!
對普通類型進行查詢:
GET _analyze
{
"analyzer": "standard",
"text": "你好,世界"
}
輸出:
4.9.2 環(huán)境準備
PUT /yixin3
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"age":{
"type": "long"
},
"desc":{
"type": "text"
}
}
}
}
PUT /yixin3/_doc/1
{
"name":"一心同學",
"age":18,
"desc":"專注于Java"
}
4.9.3 查詢
關鍵字分詞
我們來對“一心同學”進行分詞,由于name屬于 keyword,所以利用keyword進行分詞:
GET _analyze
{
"analyzer": "keyword",
"text": "一心同學"
}
輸出:
{
"tokens" : [
{
"token" : "一心同學",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
}
]
}
也就是說對于精確查詢我們只能查詢“一心同學”才會顯示成功!
非關鍵字分詞
GET _analyze
{
"analyzer": "standard",
"text": "專注于java"
}
輸出:
{
"tokens" : [
{
"token" : "專",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "注",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "于",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "java",
"start_offset" : 3,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 3
}
]
}
也就是說,對于精確查詢,我們只要輸入與分詞后的任意詞匯就可以查詢成功!
???查詢成功:
GET yixin3/_search
{
"query": {
"term": {
"name":"一心同學"
}
}
}
???查詢成功:
GET yixin3/_search
{
"query": {
"term": {
"desc":"專"
}
}
}
???查詢成功:
GET yixin3/_search
{
"query": {
"term": {
"desc":"java"
}
}
}
??查詢失?。?/strong>
GET yixin3/_search
{
"query": {
"term": {
"name":"一心"
}
}
}
??查詢失?。?/strong>
GET yixin3/_search
{
"query": {
"term": {
"desc":"專注于Java"
}
}
}
分析可得:
查詢類型 | 寫入類型 | 結果 |
---|---|---|
term | text | 無 |
term | keyword | 有 |
match | text | 有 |
match | keyword | 有 |
4.10 多值匹配精確查詢
需求:查詢名字為“張三”和“一心同學”的用戶。
GET yixin3/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"name": "張三"
}
},{
"term": {
"name": "一心同學"
}
}
]
}
}
}
輸出:
4.11 高亮
關鍵詞:highlight
?? 默認樣式
需求:讓搜索詞匯高亮顯示。
GET yixin/_search
{
"query": {
"match": {
"name": "一心"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
輸出:
?? 自定義高亮的樣式
pre_tags:前綴
post_tags:后綴
代碼:
GET yixin/_search
{
"query": {
"match": {
"name": "一心"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
輸出:
小結
以上就是【一心同學】整理的關于【ElasticSearch的基本操作】,對于以上的知識點非常重要,大家務必要【掌握】,建議跟著【一心同學】的思路自己動手敲一遍,相信會掌握得【更快】!文章來源:http://www.zghlxwxcb.cn/news/detail-438487.html
如果這篇【文章】有幫助到你,希望可以給【一心同學】點個贊??,創(chuàng)作不易,相比官方的陳述,我更喜歡用【通俗易懂】的文筆去講解每一個知識點,如果有對【后端技術】感興趣的小可愛,也歡迎關注???????【一心同學】??????,我將會給你帶來巨大的【收獲與驚喜】????!文章來源地址http://www.zghlxwxcb.cn/news/detail-438487.html
到了這里,關于超詳細講解Elasticsearch的基本操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!