文檔操作
最后有幾句很重要的話!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、那么問題又來了!在 or
與 and
間二選一有點過於非黑即白。 如果用戶給定的條件分詞后有 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
最后總結一句話很重要的話:必須得自己練,必須得自己練、必須得自己練!只有自己練、自己實驗 才會真的明白
如果你是看視頻教學,你不自己敲代碼可能會明白,但也一定記不住