elasticSearch学习以及DSL基础

    技术2024-01-03  93

    ES DSL

    面向文档型数据库elasticSearch

    作用:检索数据、分布式存储、数据分许ELK

    集群-节点(服务器)-索引-类型-文档

    ES 与 MYSQL比对 database -- index table -- type row -- document column -- field schema -- mapping 语句对应 select * from -- GET http://... update table set -- PUT http://...

    ES基本的增删改查

    ES RESTful API GET 获取请求对象的当前状态 POST 改变对象的当前状态 PUT 创建一个对象 DELETE 销毁对象 HEAD 请求获取对象的基础信息 # 新建索引 PUT /indexname { "settings":{ "index":{ "number_of_shards":3, # 分片数量 "number_of_replicas":1 # 复制备份数量 }, "analysis":{ "analzyer":{ "analzyer_name":{ "type":"custom", "tokenizer":"standard", "filter":[ "lowercase", "autocomplete_filter" ] } } } },"mappings":{ "type_name":{ "properties":{ "filed_name":{ "type":"string", "analyzer":"" } } } } } # 列出所有索引 GET /_cat/indices # 查询索引设置信息 GET /indexname/_settings GET /_all/_settings #查询所有索引设置 #删除 DELETE /indexname

    mapping types

    每个索引都有一个或多个映射类型(mapping type)来对索引内的文档进行逻辑分组(mapping type 就是平常所说的 type)。

    # 新增mapping或为mapping添加字段 POST /index_name/type_name/_mapping?pretty # 美化json输出,_source字段不会被美化 # 可以新增字段不能改变字段,原因是一个字段的类型修改以后,那么该字段的所有数据都需要重新索引。

    添加文档

    PUT /index_name/type_name/1 # id,可以不填,es自动生成,则只能用POST方法 POST /index_name/type_name

    查询文档

    GET /index_name/type_name/id

    修改文档

    PUT /index_name/type_name/id # PUT方法修改会覆盖原来的文档 POST /index_name/type_name/id/_update #post修改,针对field修改

    搜索 _search

    注意:ES的关键字都要加前缀_ ,所以我们在定义索引、类型名称时不要带_

    GET /_search # 返回全部数据 响应字段解释 hits 匹配到的信息 _idnex _type _id 文档信息 _source 每个文档对应的全部信息 field_name:value took 搜索耗时 _shards : total字段:参与查询的分片数 successful和failed:成功和失败的分片数 timeout 可以定义超时 GET /_search?timeout=10ms # 多索引和多类别 /_search #在所有索引中搜素 /index1/_search #在索引1中搜素 /index1,index2/_search @在索引1和2中搜素 /a*,b*/_search #在以a b开头的索引中搜素 /_all/type1,type2/_search #在所有index的type1和2中搜素 # 分页,相当于sql中limit和offset GET /_search?size=5 GET /_search?size=5&from=5

    一、query查询

    term、terms查询

    term query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的,

    term:查询某个字段里含有某个关键词的文档

    terms:查询某个字段里含有多个关键词的文档

    GET /customer/doc/_search/ { "query": { "terms": { "title": [ "blog","first"] } } }
    match查询,进行分词后查询
    GET /customer/doc/_search/ { "query": { "match": { "title": "my ss" #它和term区别可以理解为term是精确查询,这边match模糊查询;match会对my ss分词为两个单词,然后term对认为这是一个单词 } } } # match_all:查询所有文档 { "query": { "match_all": {} } } # multi_match:可以指定多个字段 { "query": { "multi_match": { "query" : "blog", "fields": ["name","title"] #只要里面一个字段包含值 blog 既可以 } } } # match_phrase:短语匹配查询 ES引擎首先分析查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变 _source:当我们希望返回结果只是一部分字段时,可以加上_source { "_source":["title"], #只返回title字段 "query": { "match_all": {} } } sort :排序desc,asc { "query": { "match": { "teamNameEn": "Rockets" } }, "sort": [{ "playYear": { "order": "desc" } }, { "heightValue": { "order": "asc" } } ] } fuzzy:模糊查询 value:查询的关键字 boost:查询的权值,默认值是1.0 min_similarity:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等,1d等于1天 prefix_length:指明区分词项的共同前缀长度,默认是0

    二、filter过滤

    filter是不计算相关性的,同时可以缓存(第二次搜索会很快)。因此filter速度快于query。

    { "size": 0, "filter": { "bool": { "must": [ { "terms": { "keyword": [ "手机", "iphone" ] } }, { "range": { "cdate": { "gt": "2015-11-09T11:00:00" } } } ] } } } # 过滤条件 # bool过滤 {"bool" : {"must":[],"should":[],"must_not":[] } } must:必须满足的条件 (相当于and) should:可以满足也可以不满足的条件 (相当于or) must_not:不需要满足的条件 (相当于not) # 范围过滤 gt:> lt:< gte:>= lte:<= # range关键词 :表示范围

    三、综合使用

    语法{query:{filtered:{}}}

    { "query":{ "filtered":{里面写query语句,对过滤后的结果匹配}, "filter":{里面写过滤条件} } } bool

    四、聚合查询

    sum聚合 { "size": 0, //表示查询多少条文档,聚合只需总和结果,输出文档可以设置为0条 "aggs": { //aggs表示是聚合查询 "price_of_sum": {//自行取名作为结果集 "sum": { "field":"price" } } } } min聚合 { "size": 0, "aggs": { "price_of_min": { "min": { "field": "price" } } } } avg聚合 求平均值 { "size": 0, "aggs": { "price_of_avg": { "avg": { "field": "price" } } } } cardinality聚合 求基数的聚合 { "size": 0, "aggs": { "price_of_cardi": { "cardinality": { //其实相当于该字段互不相同的值有多少类,输出的是种类数 "field": "price" } } } } terms聚合 { "size": 0, "aggs": { "price_of_by": { "terms": { "field": "price" //按价格来分组 } } } }

    ES集群

    ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 一个集群拥有相同的cluster.name 配置的节点组成, 它们共同承担数据和负载的压力 主节点负责管理集群的变更例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作 集群健康 1.GET /_cluster/health 返回值中的status 是我们关注的 green 主副分片均正常 yellow 主都正常,不是所有的副都正常 red 所有主分片都不正常 分片的特点 Elasticsearch 是利用分片将数据分发到集群内各处 分片是数据的容器,文档保存在分片内 分片又被分配到集群内的各个节点里 当集群规模变动,ES会自动在各个节点中迁移分片。使得数据任然均匀分布在集群中 副分片是主分片的一个拷贝,作为硬件故障时的备份。并提供返回文档读操作 在创建索引时,确定主分片数,但是副分片可以在后面进行更改 在更新一个文档时的ES内部操作 Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。 当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档 ES如何处理冲突 使用乐观并发控制 利用 _version 号来确保 应用中相互冲突的变更不会导致数据丢失 通过外部系统使用版本控制 文档的部分更新 文档不能被修改,只能被替换 如何路由一个文档到一个分片中 当索引一个文档时,我们怎么知道这个文档在什么位置 使用下面的这个路由选择公式 1.shard = hash(routing) % number_of_primary_shards 下面将对这个公式每个字段进行分析 shard 哪个分片, 也就是分片id routing 一个可变值,默认是文档的id hash 一个哈希函数,对rounting字段进行哈希计算生成一个数字 number_of_primary_shards 主分片的数量,routing字段经过hash函数计算之后的值,将对 主分片的数量也就是 number_of_primary_shards 进行取与,之后得到的shard就是我们文档所在的分片的位置 https://www.cnblogs.com/wangshouchang/p/8049492.html

    ES别名

    在es里面index aliases就像是软连接一样,它可以映射一个或多个索引,提供了非常灵活的特性,使用它我们可以做到:

    (1)在一个运行中的es集群中无缝的切换一个索引到另一个索引上

    (2)分组多个索引,比如按月创建的索引,我们可以通过别名构造出一个最近3个月的索引

    (3)查询一个索引里面的部分数据构成一个类似数据库的视图(views)

    Processed: 0.014, SQL: 9