利用kibana学习 elasticsearch restful api (DSL)

时间:2021-10-30 01:01:48

利用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。