ElasticSearch回顧2-這也能增刪改查?
我們知道ES是一個搜索引擎,但其實他也能做到實時存盤,甚至當一個資料庫用
增刪改查
又到了大家喜聞樂見的CRUD環節
我們先看看創建
PUT
先插個三條資料康康
PUT /feng666/user/1
{
"name": "馮半仙",
"age": 18,
"desc": "就這就這?不會還有人0offer吧",
"tags":["菜","窮","丑"]
}
PUT /feng666/user/2
{
"name": "馮大仙",
"age": 22,
"desc": "哦原來是我自己啊",
"tags":["很菜","很窮","也不帥"]
}
PUT /feng666/user/3
{
"name": "馬云",
"age": 55,
"desc": "還不來修福報啊",
"tags":["996","福報","奮斗"]
}
查看資料

注:
執行命令時,若資料不存在,則新增該條資料,如果存在則修改這條資料
GET
我們可以用GET查詢,獲得資料

如果想修改,則put直接覆寫
PUT /feng666/user/1
{
"name": "馮半仙",
"age": 18,
"desc": "就這就這?不會還有人0offer吧",
"tags":["不菜","不算窮","不算太丑"]
}

如果更改一部分,還得把之前的全部寫一遍,也太麻煩了,這不合理,

那我們可以試一下post來更新資料
POST
我們使用 POST 命令,在 id 后面跟 _update ,要修改的內容放到 doc 檔案(屬性)中即可,
POST /feng666/user/1
{
"doc":{
"name": "馮半仙666",
"desc":"別罵了別罵了"
}
}
運行結果

查詢
剛才就知道了,查詢用GET就完事兒了
比如查第一條資料,
GET /feng666/user/1
那如果條件查詢呢?把欄位加入 _search?q=
GET /feng666/user/_search?q=name:馮半仙666
GET /feng666/user/_search?q=name:馬云
通過 _serarch?q=name:馮半仙666 查詢條件是name屬性有馮半仙666的那些數據,

我們查馮半仙666的時候,發現兩個結果都回傳了

并且回傳值里面有個hits,還有一個_score,得分,分越高表示查詢條件匹配度越高
也可以自己構建查詢條件
構建查詢
GET feng666/user/_search
{
"query":{
"match":{
"name": "馮半仙"
}
}
}
回傳結果

我們也可以查詢全部,怎么查呢?
GET feng666/user/_search
{
"query":{
"match_all": {}
}
}
可以發現查出了所有的資料,這里查詢不構建條件
就像select * from table_name一樣

如果只要select 某個屬性 from table_name呢?
繼續構建
GET feng666/user/_search
{
"query":{
"match_all": {}
},
"_source": ["name","desc"]
}
可以發現回傳了指定結果

查詢結果排序
咱mysql里有order by desc ,那es里呢?一樣一樣的
構建
GET feng666/user/_search
{
"query":{
"match_all": {}
},
"sort":[
{
"age":{
"order": "desc"
}
}
]
}
使用desc和asc分別測驗

分頁查詢
GET feng666/user/_search
{
"query":{
"match_all": {}
},
"sort":[
{
"age":{
"order": "asc"
}
}
],
"from": 0,
"size": 1
}

布爾查詢
我們添加一個name也叫馮半仙666的資料,但其他屬性不相同
PUT /feng666/user/4
{
"name": "馮半仙666",
"age": 28,
"desc": "年紀大了,不能加班了",
"tags":["頭發呢","身體不行了","眼圈重"]
}
我們用must查詢name是馮半仙666的,但年齡是18歲的
must(and)

查詢結果

有點像select * from user where name = “馮半仙” and age = 18的意思
那如果是或條件呢?
should(or)
查詢name是馮半仙666或者年齡是18的
GET feng666/user/_search
{
"query":{
"bool": {
"should": [
{
"match": {
"name": "馮半仙666"
}
},
{
"match": {
"age": "18"
}
}
]
}
}
}
查詢結果

那查詢年齡不是18的呢
must_not(not)
GET feng666/user/_search
{
"query":{
"bool": {
"must_not": [
{
"match": {
"age": "18"
}
}
]
}
}
}
查詢結果

Fitter
查詢指定name,age大于18的資料
GET feng666/user/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "馮半仙666"
}
}
],
"filter":{
"range":{
"age":{
"gt":18
}
}
}
}
}
}
gt是大于的寫法我們在java里早就接觸過了
類似的還有
-
gt 表示大于
-
gte 表示大于等于
-
lt 表示小于
-
lte 表示小于等于
如果是查詢25-30歲之間,
GET feng666/user/_search
{
"query":{
"bool": {
"must": [
{
"match": {
"name": "馮半仙666"
}
}
],
"filter":{
"range":{
"age":{
"gt":25
, "lt": 30
}
}
}
}
}
}
可以發現只回傳了一個符合的結果

term精確查詢
term查詢直接通過倒排索引指定的詞條查詢的
- 分詞:term直接查詢精確的
- match:會使用分詞器決議,先分析檔案
注意:
我們用的ES7版本中,mappings properties去給多個欄位(fields)指定型別的時候,不能給我們的索引指定型別
PUT test2
{
"mappings":{
"properties":{
"name":{
"type": "text"
},
"desc": {
"type": "keyword"
}
}
}
}
//插入資料
PUT test2/_doc/1
{
"name": "馮半仙Java name",
"desc": "馮半仙Java desc"
}
PUT test2/_doc/2
{
"name": "馮半仙Java name",
"desc": "馮半仙Java desc2"
}
在上面的test2索引中,欄位name被查詢時會被分析器進行分析后匹配查詢,但keyword型別不會被分析器處理
測驗可得
GET _analyze
{
"analyzer": "keyword",
"text": "馮半仙Java name"
}
運行

可以發現這里簡單的字串,并未被分析,如果改成name屬性
GET _analyze
{
"analyzer": "standard",
"text": "馮半仙Java name"
}
運行

總結:keyword不會被分析器分析
GET test2/_search // text 會被分析器分析查詢
{
"query": {
"term": {
"name": "馮"
}
}
}
GET test2/_search // keyword 不會被分析所以直接查詢
{
"query": {
"match": {
"desc": "馮半仙Java desc"
}
}
}
兩個型別:text keyword —>>> text型別可以被分詞器決議,keyword型別不會被分詞器決議
term和match查詢區別
1、match查詢
match是經過分析(analyer)的,也就是說,檔案是先被分析器處理了,根據不同的分析器,分析出 的結果也會不同,在會根據分詞 結果進行匹配,
并且根據lucene的評分機制(TF/IDF)來進行評分,
2、term查詢
term是代表完全匹配,即不進行分詞器分析,檔案中必須包含整個搜索的詞匯
terms
官網API介紹 https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_multiple_exact_values.html
再插入兩個欄位
PUT test2/_doc/3
{
"t1": "22",
"t2": "2020-10-20"
}
PUT test2/_doc/4
{
"t1": "33",
"t2": "2020-10-21"
}
使用精確查詢
GET test2/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"t1": "22"
}
},
{
"term": {
"t1": "33"
}
}
]
}
}
}
除了bool查詢之外
GET test2/_doc/_search
{
"query": {
"terms": {
"t1": ["22","33"]
}
}
}
高亮顯示
我們在搜索的時候,會發現查詢結果與關鍵詞一致時,關鍵詞會高亮,這是怎么做到的呢?

ES就內置了高亮結果顯示的查詢,我們知道,瀏覽器的高亮其實就是給關鍵字加了一個標簽實作的
GET feng666/user/_search
{
"query": {
"match": {
"name": "半仙"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
查詢后回傳的結果

這是es默認的是em標簽,我們也可以自定義高亮標簽
GET feng666/user/_search
{
"query": {
"match": {
"name": "半仙"
}
},
"highlight": {
"pre_tags": "<b class='key' style='color:red'>",
"post_tags": "</b>",
"fields": {
"name": {}
}
}
}
運行結果

關于ElasticSearch的學習就到這里,其實總結的在全,也沒有官網的API全,技術是學不完的,我們主要是為了提升自己的學習能力,比如看官方檔案也能去實作個7788,就是進步,
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/191006.html
標籤:其他
上一篇:從可視化模板,到資料倉庫、數字化的資料,我整理并分享出來
下一篇:Beeline連接hiveserver2報錯 User: root is not allowed to impersonate root
