ElasticSearch高级使用

1. ElasticSearch基本使用

1.1 基本概念

  1. 集群和节点 :多个节点组成一个集群,每一个集群都有一个唯一的名字,默认为“elasticsearch”,每一个节点都有其自己的名字,但每一个节点都是通过集群的名字来加入集群的
  2. 索引:含有相同属性的文档集合,就相当于sql里面一个database,就是一个数据库;
  3. 类型:索引可以定义一个或多个类型,文档必须属于一个类型,就相当于sql里面一个table,也就是一个表;索引名要小写且没有下划线
  4. 文档:是可以被索引的基本数据单位,相当于sql里面的一条记录;
  5. 分片:每个索引都有多个分片,每个分片都是一个Luence索引;分片是为了缓解大数据量的索引所带来的硬盘压力,并减少对搜索速度造成的瓶颈;分片允许用户进行横向和纵向的扩展
  6. 备份:拷贝一份分片就完成了分片的备份;可以在主分片失效或者损坏的时候来代替主分片来执行搜索任务,提高ES的可用性,并分摊搜索压力
  7. ES在创建是会自动创建五个分片,一个备份;分片的数量只能在创建索引的时候确定,而不能在后期进行修改,而备份可以修改

1.2 RESTFul API

ElasticSearch的API组成示意RESTFul API的风格来命名自己的API的;

API基本格式:http://:/<索引>/<类型>/<文档id>

常用HTTP动词:GET/ PUT/ POST/ DELETE

1.3 创建索引

1.3.1 非结构化创建

非结构化创建

book索引

这里可以查看book这个索引的信息来看出来,他是结构化还是非结构化的索引

索引信息

1.3.2 结构化创建

结构化创建

{
  "novel": {
    "properties": {
      "title": {
        "type": "text"
      }
    }
  }
}

再去到概览里面,右上角刷新,之后查看book的索引信息,就会看到mapping当中有了参数

结构化索引查看

这里会有一个问题,就是在复合查询的时候,json格式的数据会很麻烦而且易错,所以大家可以考虑使用Postman工具来进行API的操作;

Postman操作

{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    },
    "mappings":{
        "man":{
            "properties":{
                "name":{
                    "type":"text"
                },
                "country":{
                    "type":"keyword"
                },
                "age":{
                    "type":"integer"
                },
                "data":{
                    "type":"date",
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        }
    }
}

再次刷新Head插件页面,便会展示出我们刚设置好的索引

postman索引

1.4 插入操作

1.4.1 指定文档id插入

还是利用postman工具,访问people/man/1并输入接送数据

指定id

然后再次刷新Head插件页面,你会发现people这个索引下面的docs从0变成了1,这便意味着我么插入数据成功了,最上方数据浏览选项卡里面便能够看到我们插入的数据;

1.4.2 自动产生文档id插入

直接借用上面的数据做一些修改

自动id

这个时候你可以去Head页面去查看了,docs从1变成2了,数据浏览也能看到我们刚刚插入的信息;

1.5 修改操作

1.5.1 直接修改文档

直接修改

1.5.2 脚本修改文档

脚本修改,就是利用ES内置支持的语言,来对文档内容进行修改;ES自身支持的语言有:painless,groovy,JavaScript以及python;

脚本修改

当然也可以把参数提取出来,单独写

{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.age = params.age",
        "params":{
            "age":100
        }
    }
}

1.6 删除操作

1.6.1 删除文档

删除文档的操作就很简单,只需要在postman中输入想要删除的文档id的路径,发送一个delete请求就可以了

删除文档

1.6.2 删除索引

删除索引就属于一种敏感操作,一旦删除,就会失去该索引下面所有的数据;

删除操作你可以直接在head界面里,在你想要删除的索引下面动作下拉栏里面去删除

删除索引

删除提示

当然你也可以在postman中进行删除,类似删除文档,你只需要把路径保留到你要删除的索引,发送delete请求即可;

Postman删除

上面两个步骤执行完成后,就把之前创建的两个索引都删掉了,此时再来head来查看,就不再有任何的数据了;

删除之后

1.7 查询操作

1.7.1 准备工作

​ 我们上面的操作已经清空了我们ES,这里为了方便我们后面的查询操作,我预先构建了一个索引,这里我只放出结构,希望大家能够自己动手去创建一下,以加深印象

索引结构

文档数据

1.7.2 简单查询

顾名思义,简单查询就只需要输入路径加你想要查询的id,发送get请求即可

简单查询

1.7.3 条件查询

添加查询就是发送一些你设定好的条件参数,然后post发送这些参数,等待ES查询结果
条件查询

这里先简单说明一下里面的一些参数是什么意思,具体的语法在后面会详细讲解

{
    // 查询
    "query":{
        // 匹配所有
        "match_all":{},
        // 匹配(按条件)
        "match":{
            "title":"Java"
        }
    },
    // 从哪开始
    "from":1,
    // 数据个数
    "size":2,
    // 自定义排序
    "sort":[
        // 出版日期,降序
        {"publish_date":{"order":"desc"}}
    ]
}
1.7.4 聚合查询
{
    // 聚合查询关键字
    "aggs":{
        // 自定义查询名称(可以多个)
        "group_by_word_count":{
            // 关键词,聚合
            "terms":{
                // 指定聚合字段
                "field":"word_count"
            },
            // 关键词,计算
            "stats":{
                "field":"word_count"
            }
        }
    }
}

聚合查询

最下面便是聚合信息,相同字数的数据便被聚合在了一起;

2. ElasticSearch高级使用

query,filter语法

2.1 子条件查询

子条件查询就是以特定字段查询所指特定值:分为Query Context和Filter Context

  1. Query Context

    在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_sorce来表示匹配度,旨在判断目标文档和查询条件匹配的有多好

    a. 全文本查询:针对文本类型数据;

    {
        // 查询
        "query":{
            // 匹配所有
            "match_all":{},
            // 匹配(按条件模糊搜索)
            "match":{
                "title":"Java"
            },
            // 精确匹配
            "match_phrase":{
                "title":"Java"
            },
            // 组合搜索
            "multi_match":{
                // 搜索内容
                "query":"",
                // 搜索范围
                "fields":[]
            },
            // 语法查询(支持通配符,布尔查询等)
            "quer _string":{
                // 搜索内容(利用AND或者OR来进行连接)
                "query":"",
                // 搜索范围
                "fields":[]
            }
        }
    }
    

    b. 字段查询:针对结构化数据,如数字,日期等;

    {
        // 查询
        "query":{
            // 范围查询
           "range":{
               "word_count":{
                   // 大于等于(greater than or equal)
                   "gte":1000,
                   // 小于等于
                   "lte":10000
               }
           }
        }
    }
    
  2. Filter Context

    在查询过程中,只判断该文档是否满足条件,只有YES或NO;filter基本上就是用来做数据过滤的,比query要快一些,但是要结合bool来使用,结果会被ES进行缓存;

    {
        // 查询
        "query":{
            // bool关键字
            "bool":{
                // filter关键词
                "filter":{
                    // 过滤条件
                    "trem":{
                        
                    }
                }
            }
        }
    }
    
2.2 复合条件查询

复合条件查询就是以一定的逻辑组合子条件查询,常见的包括:固定分数查询,布尔查询等等;

{
    "query":{
        // 固定分数查询
        "constant_score":{
            // 过滤
            "filter":{
                "match":{

                }
            },
            // 指定分数
            "boost": 1
        },
        // 布尔查询
        "bool":{
            // 应当满足的条件
            "shoule":[
                // 多个条件之间为或
            ],
            // 必须满足的条件
            "must":[
                // 多个条件之间为与
            ],
            // 必须不能满足
            "must_not":[

            ]
            // 这些都可以和filter进行组合,再进一步筛选
        }
    }
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页