这是早期的学习笔记,可能现如今版本更新后有些并不适用了

申明:此文章是早期学习的时候从其他博主的博文中整理而来的,但不记得是哪位博主的了,无法提供原文链接,见谅!!!

基本语法:

1:简单查询:条件查询 query 指定id查询,

2:条件查询:关键字查询 query

3:聚合查询:聚合查询 aggs(统计查询)

高级查询

1:子条件查询:特定字段查询所指定的值(叶子条件查询)

Query context  (查询过程中,除了判断文档中是否满足条件外,ES还会计算一个  _score 来表示匹配程度,

                              指在判断目标文档和查询条件匹配的程度)

  • 全文本查询(针对文本类型数据)、
  • 字段级别查询(针对结构化数据,如:数字、日趋等)

 Filter context

2:复合条件查询:以一定的逻辑组合子条件查询

ES表结构对应MySQL(对应名词):这样对比只是为了便于理解,并不严谨

MySQL

ElasticSearch

面向对象

Database

Index

(对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中)

 

Table

Type(ES6以后一个Index只创建一个Type)

对象中的class , 同一Json的格式的数据集合

Row

Document

面向对象里的一个对象object

Column

Field

对象的属性、字段

Schema

Mapping

 

 

Cluster(整个ES默认就是集群状态,整个集群是一份完整、互备的数据)

 

 

Node(集群中的一个节点,一般只一个进程就是一个node)

 

 

Shard(即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片)

 

MySQL:

select * from user where name = '张三' ;

ES:

GET/user/_search?q=name:张三

es 的 api  格式  基本是:请求方式  /索引名/文档名/id?参数   ,但是 还有 很多不是这样的 请求,比如 _cat api  等等....

查询 所有索引

GET /_cat/indices

查看节点健康 get /_cat/health?v    (?v 的意思 显示列出项 的title,?pretty 结果 json 格式化的方式输出)

GET /_cat/health?v   

添加索引  put /user; 

PUT user
{
    "mappings":{
        "person":{
            "properties":{
                "id":{
                    "type":"keyword"
                },
                "age":{
                    "type":"short"
                },
                "name":{
                    "type":"keyword"
                },
                "sex":{
                    "type":"keyword"
                }
            }
        }
    }
}

添加一条 docment( 如果已经存在 那么就全部覆盖):

PUT /user/person/888
{
  "age":18,
  "name":"小明",
  "sex":""
}
PUT /test1/d1/1
{
  "age":1,
  "name":"zs",
  "bri":"2018-08-08"
}

注意: 如果 只需要插入,不修改 则在后面 加上 /_create (这时候会提示已经存在),post 不能带_create


修改 一条文档

POST /test1/d1/2
{
  "age":1,
  "name":"zs",
  "bri":"2018-08-08"
}

注意:

1、post 虽然是新增,但是 在带有id 的情况下 和 put 几乎一样(id 存在就是 全量 修改,不存在就是 新增)。

2、可以 使用  POST /test1/d1  不带id 的方式 自动生成id,put 不支持不带id的写法

3、 post 可以 指定_update  ,并且 可以带_create。

4、post 可以部分更新 专用名字  partial update 

POST /test1/d1_update
{
  "doc":{
    "age":2
  }
}

删除一条文档

DELETE  index/type/id

删除一条索引

DELETE  index

关于 primary shard replica shard 的解释

 primary shard:se 对数据进行切片 ,把一个索引的 数据 分成多份 ,每一份数据就是一个  primary shard, primary shard 的数量只能在创建索引的时候指定,因为后期 修改  primary shard 数量 会乱 文档id 计算 文档所在 shard 的 结果。

 replica shard: 副本节点,多个副本节点可以提高数据的安全性,并且可以分担 primary shard 的查询 负载

注意:修改只能发生在 primary shard ,查询可以发生在任意 shard


常用查询:

全文本查询:针对文本

1、查询全部:match_all

2、模糊匹配: match (类似sql 的 like)

3、全句匹配: match_phrase (类似sql 的 = )

4、多字段匹配:muti_match (多属性查询)

5、语法查询:query_string (直接写需要配置的 关键字 )

6、字段查询 : term (针对某个属性的查询,这里注意 term 不会进行分词,比如 在 es 中 存了 “火锅” 会被分成 “火/锅” 当你用 term 去查询 “火时能查到”,但是查询 “火锅” 时,就什么都没有,而 match 就会将词语分成 “火/锅”去查)

7、范围查询:range ()

8、字段查询:针对结构化数据,如数字,日期 。。。

9、分页:

  “from”: 10,

  “size”: 10

 

constant_score: 固定分数。

 

filter: 查询: (query 属于类似就可以查出来,而 filter 类似 = 符号,要么成功,要么失败,没有中间值,查询速度比较快)

查询单条 文档 

GET user/student/2

搜索文档

GET user/_search

备注:查询可以不指定 type 的类型

查询 所有

GET /user/person/_search
{
  "query": {
    "match_all": {}
  }
}

指定字段查询

GET /user/person/_search
{
  "query":{
    "match":{
      "name":"小明"
    }
  }
}

范围 查询

GET /user/student/_search
{
    "query":{
      "range": {
        "bri": {
          "gte": 10,
          "lte": 20
        }
      }
    }
  
}

多条件的 复合 查询

GET /user/student/_search
{
    "query":{
      "bool": {
        "must": [
          { "match": {
            "FIELD": "TEXT"
          }}
        ],
        "should": [
          {"match": {
            "FIELD": "TEXT"
          },
          "match": {
            "FIELD": "TEXT"
          }
            
          }
        ],
        "minimum_should_match": 1
        
      }
    }
  
}

备注

1、bool 里面的 都是一些 条件 ,must 必须瞒足,

2、should 只要要满足 

3、minimum_should_match 个条件是ture ,

4、filter 只是过滤 不计入评分

filter: 查询: (query 属于类似就可以查出来,而 filter 类似 = 符号,要么成功,要么失败,没有中间值,查询速度比较快)

 

mutil_match 查询:“query”: “串串”, 为要查寻的关键字,“fields”: [ “title”, “tag”] 从 title 和 tag 属性中去找。有一个匹配就算成功

{
    "query": { 
"multi_match": {
 "query": "串串",
 "fields": [ "title", "tag"]
 }
    } 
}

query_string 可以限定 查询字段(默认查询所有字段)

{
  "query": {
    "query_string": {
      "query": "(水煮肉 and 回锅肉) or 西葫芦",
      "fields": ["title" ]
    }
  }
}

constant_score: 固定分数。 (指定 boost 匹配分数是 2 的结果,默认不填是 1),固定分数查询不支持 match 只支持 filter

{
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "title": "火锅"
        }
      },
      "boost": 2
    }
  }
}

bool 查询

must: 是 类似 and

must_not :不等于

should: 类似 or

{
  "query": {
    "bool": {
      "must": [
        {
         "match": {
            "title": "火锅"
          }
        },
        {
          "match": {
            "tag": "串串"
          }
        }
      ]
    }
  }
}

should 语法查询

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "串串"
          }
        },
        {
          "match": {
            "tag": "西葫芦"
          }
        }
      ]
    }
  }
}

 


查询非分页

GET /user/student/_search
{
    "query":{
      "match_all": {}
    },
    "from":3,
    "size":2
  
}

备注:

1、深分页问题,效率会很低,尽量避免深分页。

2、深分页:如果要查询出 每页 100 条,的第 100 页数据数据( 9900 - 10000 ),如果是去5 个节点查询,那么会在 每个节点查询出 第 9900- 10000 条数据,然后 汇总到 坐标几点,然后排序后取出 9900-10000 条,这样做非常占 资源

解决方案:

scoll 游标查询,指定 scroll=时间 ,指定保存的分钟数,第一次发起请求放回的不是数据,而是 _scroll_id ,后面通过 _scroll_id 去请求数据,非常适合大批量查询

GET /user/student/_search?scroll=1m
{
    "query":{
      "match_all": {}
    },
    "size":2
  
}
GET /_search/scroll
{
    "scroll": "1m",
    "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAIuFkRMbVZ0WFdvU1ZHWEJuelFIQk4tdFEAAAAAAAACLBZETG1WdFhXb1NWR1hCbnpRSEJOLXRRAAAAAAAAAi0WRExtVnRYV29TVkdYQm56UUhCTi10UQAAAAAAAAO1FlQwSkJqVng5UVpPUTIwbWw0a0NKV3cAAAAAAAADthZUMEpCalZ4OVFaT1EyMG1sNGtDSld3"
}

注:

游标 查询 是在 es 里面缓存了结果 ,然后一次 一次的去取 所以发起 第一次请求的时候只有 size ,没有from ,后面的 请求只有 scroll_id 和  scroll 时间


查询只显示指定结果 ( _source )

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["bri"]
}

post_filter  query 的 区别 ,语法上没区别,唯一的在于 filter 不评分,所以 filter  query  快很多 ,filter 和query  可以共存

GET /user/_search
{
  "post_filter": {
    "match_all": {}
  },
  "_source": ["bri"]
}

聚合函数  求了平均值和 总数量

GET  user/student/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "total_count": {
      "value_count": {
        "field": "age"
      }
    },
    "pjz":{
      "avg": {
        "field": "age"
      }
    }
    
  }
  
}

分组查询

GET user/student/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "fz": {
      "terms": {
        "field": "age"
      }
    }
  }
  
}

遇到 Fielddata is disabled on text fields by default 异常的 解决方案:

因为text类型默认没有正排索引,所以不支持排序 和聚合 ,遇到这种 异常的时候 需要制定 开启正排索引。倒排索引用于搜索,正排索引用于排序和聚合


开启正排索引的方法

PUT user/_mapping/student/
{
  "properties": {
    "sex": {
      "type":"text",
      "fielddata":true
    }
  }
}

 


批查询 api mget

批量查询

GET /_mget
{
  "docs":[
    {
      "_index":"user",
      "_type":"student",
      "_id":1
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":2
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":3
    }
  ]
}

备注:mget 如果请求url 里面有 index type 后面 的 请求体里面就可以不写  index type

 :批量查询

GET /user/_mget
{
  "docs":[
    {
      "_type":"student",
      "_id":1
    },
    {
      "_type":"student",
      "_id":2
    },
    {
      "_type":"student",
      "_id":21111111
    }
  ]
}

批处理 bulk

 

bulk的格式:actionindex/create/update/delete 后面如果有请求体就跟上请求体

{
    "create":{
        "_index":"user",
        "_type":"student",
        "_id":"100"
    }
}
{
    "name":"zhaoer",
    "age":7,
    "sex":"nn"
}
{
    "update":{
        "_index":"user",
        "_type":"student",
        "_id":"100"
    }
}
{
    "doc":{
        "name":"zhaoer",
        "age":7,
        "sex":"nn"
    }
}
{
    "delete":{
        "_index":"user",
        "_type":"student",
        "_id":"100"
    }
}
{
    "index":{
        "_index":"user",
        "_type":"student"
    },
    "_id":"100"
}
{
    "doc":{
        "name":"zhaoer",
        "age":7,
        "sex":"nn"
    }
}

注:

1、delete 没有请求体。

2、create update 只有在指定的状态才能成功 create 创建 ,update 更新。

3、批处理中的一个 失败不影响 其他的 执行。 

4、update 需要 doc 包一层

5、index create update 的 功能,并且支持 又或者 没有 doc 包一层都支持


逻辑删除:es 的删除是 是假删除并且在下一次merge的时候真删除

乐观锁:es的 并发处理 ,使用的乐观锁 在 后面加上 version,只有version = 当前记录的version的时候才能修改成功

POST  /user/student/1?version=3
{
  "name":"zyk",
  "age":0
}

es 可以自动控制 vserion 通过 ,version_type指定:

1、version_type=external 要求 version 大于当前的version

2、version_type=internal 这个是默认值 ,必须等于当前的值<br>version_type=external_gte 大于等于当前的

POST  /user/student/1?version_type=external&version=505
{
  "name":"zyk",
  "age":0
}