利用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)的更多相关文章

  1. windows系统中 利用kibana创建elasticsearch索引等操作

    elasticsearch之借用kibana平台创建索引 1.安装好kibana平台 确保kibana以及elasticsearch正常运行 2.打开kibana平台在Dev Tools 3.创建一个 ...

  2. spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别

    今天学习一下RESTFul api拦截 大概有三种方式 一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式. 这种过滤器拦截 ...

  3. Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController

    用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...

  4. DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API

    背景: 上一篇博文简单翻译了Orthanc官网给出的CodeProject上“利用Orthanc Plugin SDK开发WADO插件”的博文,其中提到了Orthanc从0.8.0版本之后支持快速查询 ...

  5. 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询

    https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...

  6. [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

    原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP ...

  7. 利用koa打造restful API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  8. 搜索引擎Elasticsearch REST API学习

    Elasticsearch为开发者提供了一套基于Http协议的Restful接口,只需要构造rest请求并解析请求返回的json即可实现访问Elasticsearch服务器.Elasticsearch ...

  9. Elasticsearch索引的操作,利用kibana(如何创建/删除一个es的索引?)

    我们已经通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射.现在我们需要对这个建立索引的过程做更多的控制:我们想要确保这个索引有数量适中的主分 ...

随机推荐

  1. FCC-学习笔记 Missing letters

    FCC-学习笔记  Missing letters 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecodecamp.c ...

  2. 配置全文搜索引擎solr

    前言 solr是apache下的一个子项目,用java编写基于Lucene开发的全文搜索服务器,不同于Lucene,solr一个完成的搜索服务器,提供了众多接口调用,而Lucene只是个工具包.如果用 ...

  3. MongoDB 4.X 用户和角色权限管理总结

    关于MongoDB的用户和角色权限的梳理一直不太清晰,仔细阅读了下官方文档,并对此做个总结. 默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随 ...

  4. 【IDE_IntelliJ IDEA】idea中设置类和方法的注释模板

    参考博文:idea生成类注释和方法注释的正确方法

  5. flask上下文管理之threading.local

    Flask之上下文管理 知识储备之问题情境: request中的参数: 单进程单线程 单进程多线程-->reqeust 会因为多个请求,数据发生错乱.--->可以基于threading.l ...

  6. 201871010109-胡欢欢《面向对象程序设计(java)》第6-7周学习总结

    实验六 继承定义与使用 实验时间 2019-9-29 第一部分:理论部分. 1.继承:已有类来构建新类的一种机制.档定义了一个新类继承另一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的 ...

  7. 201777010217-金云馨《面向对象程序设计(Java)》第十二周学习总结

      内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  8. robotframework-post request请求携带上一个请求返回的cookie

    公司的接口服务需要先登录,获取服务端的cookie后,在后续的请求中携带这个cookie才能够访问 在尝试用RF工具进行自动化接口测试时,发现先访问登录接口之后,接着请求其他接口时没有自动携带上次请求 ...

  9. Python27期:错误宝典

    错误信息1:SyntaxError:invalid syntax--无效语法 解决办法:变量名不能使用关键字如下图: 错误信息2:TypeError:'str' object is not calla ...

  10. 洛谷 U86564 排队形

    洛谷 U86564 排队形 题目传送门 题目背景 \(JDFZ2019\)秋季运动会开始辣!为了使强大的高一 · \(6\)班有一个更好的精神面貌,班主任\(T\)老师和体委\(LY\),\(LYB\ ...