利用kibana學習 elasticsearch restful api (DSL)

利用kibana學習 elasticsearch restful api (DSL)html

一、瞭解elasticsearch基本概念
Index: database
Type: table
Document: row
Filed: fieldgit

二、關鍵字:
PUT 建立索引,eg:PUT /movie_index 新建movie_index索引
GET 用於檢索數據,eg:GET movie_index/movie/1
POST 用來修改數據,eg:POST movie_index/movie/3/_update
DELETE 用來刪除數據github

三、例子
下面經過電影來演示,一部電影有多個演員。
public class Movie {
String id;
//電影名稱
String name;
//豆瓣評分
Double doubanScore;
//演員列表
List<Actor> actorList;
}算法

public class Actor{
String id;
//演員名稱
String name;
}sql

3.一、添加索引
$ PUT /movie_index數據庫

3.二、刪除索引
$ DELETE /movie_indexapi

3.三、查看全部的索引庫
$ GET _cat/indices?v緩存

3.四、新增文檔{新增索引庫}
添加三部電影restful

PUT /movie_index/movie/1
{
"id":1,
"name":"operation red sea",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}oracle

PUT /movie_index/movie/2
{
"id":2,
"name":"operation meigong river",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"zhang han yu"}
]
}

PUT /movie_index/movie/3
{
"id":3,
"name":"incident red sea",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"liu de hua"}
]
}

3.四、直接用id查找
$ GET movie_index/movie/1
$ GET movie_index/movie/2
$ GET /movie_index/movie/3

3.五、修改——總體替換
和新增沒有區別

PUT /movie_index/movie/3
{
"id":"3",
"name":"incident red sea",
"doubanScore":"5.0",
"actorList":[
{"id":"1","name":"zhang guo li 001"}
]
}

能夠從新執行,_version一直遞增。

3.六、修改——某個字段
POST movie_index/movie/3/_update
{
"doc": {
"doubanScore":"7.0"
}
}

3.七、刪除一個document
DELETE movie_index/movie/3

3.八、搜索type所有數據 {select * from tname}
GET movie_index/movie/_search
{
"took": 1, //耗費時間 毫秒
"timed_out": false, //是否超時
"_shards": {
"total": 5, //發送給所有5個分片
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2, //命中2條數據
"max_score": 1, //最大評分
"hits": [ //查詢結果
{
"_index": "movie_index",
"_type": "movie",
"_id": "2",
"_score": 1,
"_source": {
"id": 2,
"name": "operation meigong river",
"doubanScore": 8,
"actorList": [
{
"id": 3,
"name": "zhang han yu"
}
]
}
},
.....
]
}
}

3.九、按條件查詢(所有)
GET movie_index/movie/_search
{
"query":{
"match_all": {}
}
}

3.十、按分詞查詢
{select * from tname where name like '%red%'}

GET movie_index/movie/_search
{
"query":{
"match": {"name":"red"}
}
}

3.十一、按分詞子屬性查詢
GET movie_index/movie/_search
{
"query":{
"match": {"actorList.name":"zhang"}
}
}

3.十二、fuzzy查詢

校訂匹配分詞,當一個單詞都沒法準確匹配,es經過一種算法對很是接近的單詞也給與必定的評分,可以查詢出來,可是消耗更多的性能。
GET movie_index/movie/_search
{
"query":{
"fuzzy": {"name":"rad"}
}
}

經過rad能夠匹配到red記錄,匹配數據相近的記錄。

3.1三、過濾--查詢後過濾
{select o.* from (select * from tname where name like '%red%') o where o.actorList.id=3 }

GET movie_index/movie/_search
{
"query":{
"match": {"name":"red"}
},
"post_filter":{
"term": {
"actorList.id": 3
}
}
}

3.1四、過濾--查詢前過濾(推薦)
其實準確來講,ES中的查詢操做分爲2種:查詢(query)和過濾(filter)。查詢便是以前提到的query查詢,它(查詢)默認會計算每一個返回文檔的得分,而後根據得分排序。而過濾(filter)只會篩選出符合的數據,並不計算得分,且它能夠緩存文檔。因此,單從性能考慮,過濾比查詢更快。

換句話說,過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。通常應用時,應先使用過濾操做過濾數據,而後使用查詢匹配數據。

eg、查詢演員ID包含1和3,且電影名稱包含red的記錄
{select * from tname where actorList.id in (1,3)}

GET movie_index/movie/_search
{
"query": {
"bool": {
"filter": [
{"term": {"actorList.id": "1"}},
{"term": {"actorList.id": "3"}}
]
}
}
}
注意:過濾(filter)只會篩選出符合的數據,並不計算得分,因此返回結果max_score字段永遠爲0。

{select * from tname where actorList.id in (1,3) and name like '%red%'}
GET movie_index/movie/_search
{
"query": {
//經過bool進行組合查詢
"bool": {
//過濾兩個條件
"filter": [
{"term": {"actorList.id": "1"}},
{"term": {"actorList.id": "3"}}
],
"must": {
"match": {"name": "red"}
}
}
}
}

3.1五、排序
每種數據庫都有排序:
Mysql,oracle,sqlserver默認的排序規則是升序,仍是降序呢?
Mysql :升序

GET movie_index/movie/_search
{
"query":{
"match": {"name":"red sea"}
},
"sort": [
{
"doubanScore": {
"order": "desc"
}
}
]
}

3.1六、分頁查詢
GET movie_index/movie/_search
{
"query": { "match_all": {} },
"from": 0,
"size": 1
}

from: 表示從第幾條開始查詢,默認從0開始
Size:表示每頁顯示的數據條數

3.1七、指定查詢的字段
GET movie_index/movie/_search
{
"query": { "match_all": {} },
"_source": ["name", "doubanScore"]
}
注意:_source: 查詢結果的hits下面的_source

3.1八、高亮
GET movie_index/movie/_search
{
"query":{
"match": {"name":"red sea"}
},
"highlight": {
"fields": {"name":{} }
}
}

修改自定義高亮標籤
GET movie_index/movie/_search
{
"query":{
"match": {"name":"red sea"}
},
"highlight": {
"pre_tags": ["<span>"], //前綴標籤
"post_tags": ["</span>"], //後綴標籤
"fields": {"name":{} }
}
}

3.1九、聚合
至關於 sql 語句中的分組!group by!

取出每一個演員共參演了多少部電影
GET movie_index/movie/_search
{
"aggs": {
"groupby_actor": {
"terms": {
"field": "actorList.name.keyword"
}
}
}
}
注意:groupby_actor聚合別名,至關於變量,上下文引用


每一個演員參演電影的平均分是多少,並按評分排序
GET movie_index/movie/_search
{
"aggs": {
"groupby_actor_id": {
"terms": {
"field": "actorList.name.keyword" ,
"order": {
"avg_score": "desc"
}
},
"aggs": {
"avg_score":{
"avg": {
"field": "doubanScore"
}
}
}
}
}
}

四、關於mapping
以前說type能夠理解爲table,那每一個字段的數據類型是如何定義的呢

查看看mapping

自定義Type。{自定義表中字段的類型}
之後工做中都是本身定義,不建議不推薦使用 es 中自定的數據類型

GET movie_index/_mapping/movie
實際上每一個type中的字段是什麼數據類型,由mapping定義。

可是若是沒有設定mapping系統會自動,根據一條數據的格式來推斷出應該的數據格式。
true/false → boolean
1020 → long
20.1 → double,float
「2018-02-01」 → date
「hello world」 → text + keyword
默認只有text會進行分詞,keyword是不會分詞的字符串。

mapping除了自動定義,還能夠手動定義,可是隻能對新加的、沒有數據的字段進行定義。一旦有了數據就沒法再作修改了。

五、中文分詞
elasticsearch自己自帶的中文分詞,就是單純把中文一個字一個字的分開,根本沒有詞彙的概念。可是實際應用中,用戶都是以詞彙爲條件,進行查詢匹配的,若是可以把文章以詞彙爲單位切分開,那麼與用戶的查詢條件可以更貼切的匹配上,查詢速度也更加快速。

分詞器下載網址:https://github.com/medcl/elasticsearch-analysis-ik/releases

https://www.cnblogs.com/linjiqin/p/10904876.html


5.一、安裝中文分詞
下載好的zip包,解壓後放到/home/es/elasticsearch-6.2.2/plugins/目錄下

注意:/home/es/elasticsearch-6.2.2/爲elasticsearch安裝所在目錄。

$ cd /home/es/elasticsearch-6.2.2/plugins/
$ unzip elasticsearch-analysis-ik-6.2.2.zip

將壓縮包文件刪除!不然啓動失敗!
$ rm -rf elasticsearch-analysis-ik-6.2.2.zip

5.二、重啓es,查看插件是否安裝
$ sudo fuser -k -n tcp 9200
$ cd /home/es/elasticsearch-6.2.2/bin
$ ./elasticsearch &
$ $ curl http://localhost:9200/_cat/plugins
prMkj8M analysis-ik 6.2.2

5.三、測試使用
5.3.一、使用默認
GET movie_index/_analyze
{
"text": "我是中國人"
}
aaa

5.3.二、使用分詞器 {簡單的分詞方式}
GET movie_index/_analyze
{
"analyzer": "ik_smart",
"text": "我是中國人"
}
bbb

5.3.三、另一個分詞器-ik_max_wordGET movie_index/_analyze{ "analyzer": "ik_max_word", "text": "我是中國人"}ccc可以看出不一樣的分詞器,分詞有明顯的區別,因此之後定義一個type不能再使用默認的mapping了,要手工創建mapping, 由於要選擇分詞器。

相關文章
相關標籤/搜索