1. 程式人生 > 其它 >Es使用kibana增刪改查以及複雜查詢

Es使用kibana增刪改查以及複雜查詢

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是不經過分詞的,直接去倒排索引查詢精確的值。
注意 ⚠ :我們現在 用的es7版本 所以我們用 mappings properties 去給多個欄位(fifields)指定型別的時 候,不能給我們的索引制定型別:

建立規則

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": {}
    }
  }
  
}