• 利用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, 因为要选择分词器。

  • 相关阅读:
    django中的FBV和CBV
    RESTful
    REST
    18.前端路由router-08权限控制
    17.前端路由router-07keep-alive
    16.前端路由router-06动态路由
    15.前端路由router-05嵌套路由
    14.前端路由router-04编程式导航
    13.前端路由router-03路由参数
    java基础总结
  • 原文地址:https://www.cnblogs.com/linjiqin/p/11615350.html
Copyright © 2020-2023  润新知