restful、lucene简介
RESTful 表述性状态转移(REpresentational State Transfer) ful代表形容词,RESTful代表满足REST规则。 使用基于RESTful架构的话需要遵循统一的对外接口原则。 接口使用标准的http方法,如GET、POST、PUT等。 个人理解由于elasticsearch就是基于RESTful,所以就可以用这种风格的api在kibana中去处理es中的数据。
Lucene Lucene技术可以做到快速的全文检索 是一个jar包,里面封装了全文检索的引擎、搜索的算法代码。 开发时引入lucene的jar包,通过api开发搜索相关业务。 底层会在磁盘上建立索引库。 Lucene做的就是倒排索引、全文搜索
Elasticsearch 是一个基于Lucene的搜索服务器,封装了许多lucene底层功能, 提供了全文搜索引擎,和基于RESTful api和许多语言的客户端。 也是一种数据库。
elasticsearch核心概念
NRT(Near Realtime):近实时 写入数据时,过几秒才会被搜索到,因为内部需要分词和录入索引。 搜索时,搜索和分析数据需要秒级出结果。
Cluster:集群 包含一个或多个启动着es实例的机器群,通常一台机器起一个es实例。 同一网络下,集群名一样的多个es实例自动组成集群, 自动均衡分片等行为。默认集群名为"elasticsearch"。
Node:节点 每个es实例称为一个节点。
Document:文档 es中最小的数据单元。 一个document就像数据库中一条记录。 通常以json格式显示。 多个document存储于一个索引中。
Index:索引 包含很多有相似结构的文档数据。 可以理解为数据库中的一个表。
Field:字段 就像数据库中的列,定义每个document应该有的字段。
Type:类型 每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类, 一个type下的document,都有相同的field。 注意type的概念已经删除
Shard:分片 index数据过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上面。
Replica:副本 为了保证数据的安全,我们会将每个index的分片经行备份,存储在另外的机器上。保证少数机器宕机es集群仍可以搜索。
elasticsearch与数据库对比
关系型数据库(比如Mysql) | 非关系型数据库(Elasticsearch) |
---|
数据库Database | 索引Index | 表Table | 也是索引Index(原为Type) | 元组Row | 文档Document | 数据列Column | 字段Field | 约束 Schema | 映射Mapping |
kibana操作elasticsearch
注意kibana中根据配置文件默认了es的ip和port,所以只需要写url中后面的内容
kibana查看es中的索引
GET /_cat/indices?v
创建lab索引(相当于一个数据库)
PUT /lab?pretty
删除lab索引
DELETE /lab
获取lab索引信息
GET /lab?pretty
插入数据
POST /lab/_doc
{
"name":"smr",
"age":"22"
}
这时插入的数据会生成随机的id,
如果想自己定义id,做法如下
POST /lab/_doc/1
{
"name":"smr",
"age":"22"
}
查看id=1的信息
GET /lab/_doc/1
查看lab索引的所有信息
GET /lab/_search
完全覆盖修改(全量数据更新)
PUT(POST) /lab/_doc/1
{
"name":"smr",
"age":"25"
}
局部更新
POST /lab/_update/1
{
"doc":{
"age":"30"
}
}
数据删除
DELETE /lab/_doc/1
查询lab索引中age为30的数据
GET /lab/_search?q=age:30
或者通过请求体查询
GET /lab/_search
{
"query":{
"match":{
"age":22
}
}
}
全查询
GET /lab/_search
{
"query":{
"match_all":{}
}
}
分页查询
GET /lab/_search
{
"query":{
"match_all":{}
},
"from":0,
"size":1
}
from是当前页起始位置,如果是第一条则是0,(页码-1)*每页数据条数
size是每页查询条数
只要age,并且对age排序
GET /lab/_search
{
"query":{
"match_all":{}
},
"_source":["age"],
"sort":{
"age":{
"order":"desc"
}
}
}
多个条件同时成立用must
GET /lab/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"age":23
}
},
{
"match":{
"name":"jgc"
}
}
]
}
}
}
多个条件成立其中至少一个用should
GET /lab/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"smr"
}
},
{
"match":{
"name":"jgc"
}
}
]
}
}
}
范围查询
GET /lab/_search
{
"query":{
"bool":{
"filter":{
"range":{
"age":{
"gt": 22
}
}
}
}
}
}
es底层基于lucene分词+倒排索引+全文检索
GET /lab/_search
{
"query":{
"match":{
"name":"这里只是一个词"
}
}
}
完全匹配+高亮显示
GET /lab/_search
{
"query":{
"match_phrase":{
"name":"jgc"
}
},
"highlight":{
"fields":{
"name":{}
}
}
}
聚合操作
示例1
GET /lab/_search
{
"aggs":{ //聚合操作
"age_group":{ //名称,随意起名
"terms":{ //分组
"field":"age" //分组字段
}
}
},
"size":0 //不要原始数据
}
示例2
GET /lab/_search
{
"aggs":{ //聚合操作
"age_avg":{ //名称,随意起名
"avg":{ //分组
"field":"age" //分组字段
}
}
},
"size":0 //不要原始数据
}
限制
PUT /lab2
PUT /lab2/_mapping
{
"properties":{
"name":{
"type":"text", //支持分词
"index":true //这个字段可以索引查询
},
"sex":{
"type":"keyword", //完整匹配
"index":true //这个字段可以索引查询
},
"tel":{
"type":"keyword", //完整匹配
"index":false //这个字段可以索引查询
}
}
}
GET /lab2/_mapping
|