利用kibana學習 elasticsearch restful api (DSL)


利用kibana學習 elasticsearch restful api (DSL)

1、了解elasticsearch基本概念
Index: database
Type: table
Document: row
Filed: field

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

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

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

3.1、添加索引
$ PUT /movie_index

3.2、刪除索引
$ DELETE /movie_index

3.3、查看所有的索引庫
$ GET _cat/indices?v

3.4、新增文檔{新增索引庫}
添加三部電影

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"}
]
}

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.4、直接用id查找
$ GET movie_index/movie/1
$ GET movie_index/movie/2
$ GET /movie_index/movie/3

3.5、修改——整體替換
和新增沒有區別

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

可以重新執行,_version一直遞增。

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

3.7、刪除一個document
DELETE movie_index/movie/3

3.8、搜索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.9、按條件查詢(全部)
GET movie_index/movie/_search
{
"query":{
"match_all": {}
}
}

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

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

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

3.12、fuzzy查詢

校正匹配分詞,當一個單詞都無法准確匹配,es通過一種算法對非常接近的單詞也給與一定的評分,能夠查詢出來,但是消耗更多的性能。
GET movie_index/movie/_search
{
"query":{
"fuzzy": {"name":"rad"}
}
}

通過rad可以匹配到red記錄,匹配數據相近的記錄。

3.13、過濾--查詢后過濾
{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.14、過濾--查詢前過濾(推薦)
其實准確來說,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.15、排序
每種數據庫都有排序:
Mysql,oracle,sqlserver默認的排序規則是升序,還是降序呢?
Mysql :升序

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

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

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

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

3.18、高亮
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.19、聚合
相當於 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"
}
}
}
}
}
}

4、關於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除了自動定義,還可以手動定義,但是只能對新加的、沒有數據的字段進行定義。一旦有了數據就無法再做修改了。

5、中文分詞
elasticsearch本身自帶的中文分詞,就是單純把中文一個字一個字的分開,根本沒有詞匯的概念。但是實際應用中,用戶都是以詞匯為條件,進行查詢匹配的,如果能夠把文章以詞匯為單位切分開,那么與用戶的查詢條件能夠更貼切的匹配上,查詢速度也更加快速。

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

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


5.1、安裝中文分詞
下載好的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.2、重啟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.3、測試使用
5.3.1、使用默認
GET movie_index/_analyze
{
"text": "我是中國人"
}
aaa

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

5.3.3、另外一個分詞器-ik_max_word
GET movie_index/_analyze
{
"analyzer": "ik_max_word",
"text": "我是中國人"
}
ccc
能夠看出不同的分詞器,分詞有明顯的區別,所以以后定義一個type不能再使用默認的mapping了,要手工建立mapping, 因為要選擇分詞器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM