利用kibana学习 elasticsearch restful api (DSL)
Posted linjiqin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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, 因为要选择分词器。
以上是关于利用kibana学习 elasticsearch restful api (DSL)的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch利用kibana调整索引mapping结构