Es使用kibana增刪改查以及複雜查詢
阿新 • • 發佈:2021-06-21
1.簡單操作
1.1 增加
先插入四條資料
PUT /esstudy/user/1 { "name": "張三", "age": 21 } PUT /esstudy/user/2 { "name": "李四", "age": 22 } PUT /esstudy/user/3 { "name": "王五", "age": 23 } PUT /esstudy/user/4 { "name": "趙六", "age": 24 }
看一下資料:
如果說資料存在那麼便是覆蓋(全量覆蓋)
PUT /esstudy/user/1 { "name": "法外狂徒張三", "age": 21, "desc": "法律大牛" }
再執行
GET /esstudy/user/1
PUT /esstudy/user/2 { "name": "李四" }已經修改了 那麼 PUT 可以更新資料但是。麻煩的是 原資料你還要重寫一遍要 這不符合我們規矩。
1.2 更新
使用 POST 命令,在 id 後面跟 _update ,要修改的內容放到 doc 文件(屬性)中即可。POST /esstudy/user/3/_update { "doc":{ "name": "王五升級", "age": 23 } }
1.3 刪除
DELETE /xxx
1.4 獲取
GET /xxx
5.查詢
GET esstudy/user/_search?q=name:趙六通過 _serarch?q=name:狂神說 查詢條件是name屬性有趙六的那些資料。 我們看一下結果 返回並不是 資料本身,是給我們了一個 hits ,還有 _score得分,就是根據演算法算出和 查詢條件匹配度高得分就搞。
2.複雜查詢
2.1 查詢所有
GET esstudy/user/_search { "query": { "match_all": {} } }
2.2 構建查詢
再插入一條資料
PUT /esstudy/user/5 { "name": "張三", "age": 21 }
再進行查詢
GET esstudy/user/_search { "query": { "match": { "name": "法外狂徒張三" } } }
通過分數來檢視誰更加符合結果
2.3限制屬性
通過 _source 來控制,比如說只需要名字的屬性GET esstudy/user/_search { "query": { "match": { "name": "張三" } }, "_source": ["name"] }
2.4 排序
根據年齡倒序
GET esstudy/user/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ] }
2.5 分頁
GET esstudy/user/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ], "from": 0, "size": 2 }
2.6 布林查詢
1. must
都要符合
例如。查詢名字是張三,年齡是21的
GET esstudy/user/_search { "query": { "bool": { "must": [ { "match": { "name": "張三" } }, { "match": { "age": 21 } } ] } } }
2. should
只要滿足一個即可
GET esstudy/user/_search { "query": { "bool": { "should": [ { "match": { "name": "張三" } }, { "match": { "age": 22 } } ] } } }3.must_not
查詢不滿足條件的,即過濾操作
GET esstudy/user/_search { "query": { "bool": { "must_not": [ { "match": { "name": "張三" } }, { "match": { "age": 22 } } ] } } }
4. filter
gt 表示大於 gte 表示大於等於 lt 表示小於 lte 表示小於等於GET esstudy/user/_search { "query": { "bool": { "must": [ { "match": { "name": "張三" } } ], "filter": { "range": { "age": { "gte": 20, "lte": 40 } } } } } }
2.7 term精確查詢
關於分詞:
term 查詢是直接通過倒排索引指定的詞條,也就是精確查詢。 term和match的區別:- match是經過分析(analyer)的,也就是說,文件是先被分析器處理了,根據不同的分析器,分析出的結果也會不同,在會根據分詞 結果進行匹配。
- term是不經過分詞的,直接去倒排索引查詢精確的值。
建立規則
PUT testdb { "mappings": { "properties": { "name": { "type": "text" }, "desc": { "type": "keyword" } } } }
插入資料:
PUT testdb/_doc/1 { "name": "法外狂徒1號", "desc": "法外狂徒1號decs" } PUT testdb/_doc/2 { "name": "法外狂徒2號", "desc": "法外狂徒2號decs" }總結:keyword 欄位型別不會被分析器分析! 然後使用term查詢
GET testdb/_search { "query": { "term": { "desc": "法外狂徒2號decs" } } }
可以看到結果只有一個
如果只查詢法外狂徒那麼一個都沒有
GET testdb/_search { "query": { "term": { "desc": "法外狂徒" } } }
精確查詢多個值:
GET esstudy/user/_search { "query": { "bool": { "should": [ { "term": { "age": "22" } }, { "term": { "age": 21 } } ] } } }
2.8 高亮顯示
GET esstudy/user/_search
{
"query": {
"match": {
"name": "張三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
可以看到加上了em標籤,當然我們也可以自定義。
GET esstudy/user/_search { "query": { "match": { "name": "張三" } }, "highlight": { "pre_tags": "<p class='key' style='color:red'>", "post_tags": "</p>", "fields": { "name": {} } } }