1. 程式人生 > 實用技巧 >elasticsearch(增刪改查詳細版)

elasticsearch(增刪改查詳細版)

文件操作

最後有幾句很重要的話!hhhhhh

1、插入

PUT test02/user/3
{
"name":"李四",
"age":"22",
"dec":"合法公民",
"tags":["交友","旅遊","愛吃雞"]
}

2、查詢

1、簡單查詢

2、簡單條件查詢

GET test02/user/_search?q=name:學狂神

3、 花樣查詢

1、匹配查詢:
GET test02/user/_search
{
"query": {
"match": {
"name": "學狂神"
}
}
}
2、結果過濾
GET test02/user/_search
{
"query": {
"match": {
"name": "學狂神"
}
},
"_source": ["name"]
}
3、排序
GET test02/user/_search
{
"query": {
"match": {
"name": "學狂神"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
4、分頁查詢
GET test02/user/_search
{
"query": {
"match": {
"name": "學狂神"
}
},
"from": 0,//從哪開始
"size": 2//顯示幾條
}
5、bool查詢

must:必須都滿足,相當於and

GET test02/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神"
}
},
{
"match": {
"age":"21"
}
}
]
}
}
}

should:只需滿足其一,相當於or

GET test02/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "狂神"
}
},
{
"match": {
"age":"21"
}
}
]
}
}
}

must_not:必須不滿足,相當於not

GET test02/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "狂神"
}
},
{
"match": {
"age":"21"
}
}
]
}
}
}
6、結果過濾
GET test02/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神"
}
}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 22
}
}
}
}
}
}
7、mach查詢
1、有一個匹配都能查出來
GET test02/user/_search
{
"query": {
"match": {
"dec": "合法"//有一個字匹配都會被查到
}
}
}

查出來後他的得分不一樣:

1.匹配的詞越多越高,

2.當匹配的詞相同時,該詞在整個欄位值中所站比例越高得分越高

2、那麼問題來了,有時候想要對text型別進行相對精確查詢,怎麼辦呢?哈哈!方法肯定有:設定and關係
GET test02/_search
{
"query": {
"match": {
"name": {
"query": "傷感王五",
"operator": "and"

}
}
}
}

也就是說必須同時滿足所有分詞,

3、那麼問題又來了!在 orand 間二選一有點過於非黑即白。 如果使用者給定的條件分詞後有 5 個查詢詞項,想查詢只包含其中 4 個詞的文件,該如何處理?將 operator 操作符引數設定成 and 只會將此文件排除。

有時候這正是我們期望的,但在全文搜尋的大多數應用場景下,我們既想包含那些可能相關的文件,同時又排除那些不太相關的。換句話說,我們想要處於中間某種結果。

match 查詢支援 minimum_should_match 最小匹配引數, 這讓我們可以指定必須匹配的詞項數用來表示一個文件是否相關。我們可以將其設定為某個具體數字,更常用的做法是將其設定為一個百分數,因為我們無法控制使用者搜尋時輸入的單詞數量:

GET test02/_search
{
"query": {
"match": {
"name": {
"query": "傷感DJ舞曲",
"minimum_should_match": "70%"//匹配度
}
}
}
}

匹配演算法:這裡傷感DJ舞曲可劃分為3個詞,3*70% 約等於2。所以只要包含2個詞條就算滿足條件了。

8、精確查詢(詞條(term)查詢)

term查詢是直接通過到倒排索引指定的詞條進行精確查詢

term 查詢被用於精確值 匹配,這些精確值可能是數字、時間、布林或者那些未分詞(keyword)的字串

PUT test01/_doc/3
{
"name":"華為電視",
"dec":"沒電還能看"
}

GET test01/_search
{
"query": {
"term": {
"dec": {
"value": "沒電還能看"
}
}
}
}

terms:terms 查詢和 term 查詢一樣,但它允許你指定多值進行匹配。如果這個欄位包含了指定值中的任何一個值,那麼這個文件滿足條件:

關於欄位型別:

核心資料型別
(1)字串

text ⽤於全⽂索引,搜尋時會自動使用分詞器進⾏分詞再匹配
keyword 不分詞,搜尋時需要匹配完整的值



(2)數值型

整型: byte,short,integer,long
浮點型: float, half_float, scaled_float,double



(3)日期型別

date

注意 只有text欄位會被分詞器解析

9、模糊查詢

fuzzy 查詢是 term 查詢的模糊等價。它允許使用者搜尋詞條與實際詞條的拼寫出現偏差,但是偏差的編輯距離不得超過2:

GET test01/_search
{
"query": {
"fuzzy": {
"dec": {
"value": "MAXDjSO",
"fuzziness": 1
}
}
}
}
10、高亮查詢(可自定義高亮效果)
GET test02/_search
{
"query": {
"match": {
"name": "傷感"
}
},
"highlight":{
"pre_tags": "<p style='color:red'>",//字首
"post_tags":"</p>", //字尾
"fields": {
"name": {}
}
}
}

注意:有一個小細節,查詢出來的東西,只有傷感這兩個字會高亮 想想你在百度搜索,是不是也一樣

3、更新

POST test02/user/2/_update
{
"doc":{
"name":"張三121"
}
}

4、刪除

DELETE test02/user/1

最後總結一句話很重要的話:必須得自己練,必須得自己練、必須得自己練!只有自己練、自己實驗 才會真的明白

如果你是看視訊教學,你不自己敲程式碼可能會明白,但也一定記不住

如果是看筆記,你自己肯定也有感觸,不要多說