Elasticsearch
Elasticsearch简介
基于Lucene的开源分布式搜索引擎,大幅降低了PB级海量数据存储、检索、分析门槛
特点:
分布式实时文件存储、检索、分析
零配置、集群自动发现
索引自动分片、副本机制
RESTful风格接口
多数据源
自动搜索负载
启动
#切换至非root用户
#前台运行,停止方式CTRL+C
./opt/es/bin/elasticsearch #前台运行
#后台运行,停止方式 kill -9 pid
后台运行
./opt/es/bin/elasticsearch -d
nohup ./opt/es/bin/elasticsearch &
查看进程号
ps -aux | grep 进程名
一、put、update、delete、get、post作用
方式 | 作用 |
---|---|
put | 增加/更新 |
update | 改变 |
delete | 删除 |
get | 查询 |
post | 查询/改变 |
二、ES数据模型
- Index:索引,由多个Document组成
- Type:索引类型,6.x中仅支持一个,以后将逐渐被移除
- Document:文档,由多个Field组成
- Field:字段,包括字段名与字段值
RDBMS | ElasticSearch |
---|---|
Database | Index |
Table | Type |
Row | 删除 |
Column | Field |
1、文档(Document)管理-1
文档是ES最小数据单元
- 原始数据
_source:原始JSON格式文档
文档元数据
_index:索引名
_type:索引类型
_id:文档编号
_version:文档版本号用于并发控制
_score:在搜索结果中的评分
1、文档(Document)管理-2
3、文档(Document)管理-3
批量插入
PUT _bulk
{"index/create/update/delete":{"_index":"...","_type":"...","_id":"..."}}
{"field1":"value1",……}
4、文档(Document)管理-4
批量读取
GET stu/doc/_mget
{"docs":[{"_id":"1"},{"_id":"2"}]}
GET stu/_mget
{"docs":[{"_type":"doc","_id":"1"},{"_type":"doc","_id":"2"}]}
GET _mget
{"docs":[{"_index":"stu","_type":"doc","_id":"1"},{"_index":"stu","_type":"doc","_id":"2"}]}
三、索引管理
1.创建索引
PUT demo.1234
2.带参数的索引创建
PUT demo.1234
{
"settings" : {
"index" : {
"number_of_shards" : 2,
"number_of_replicas" : 2
}
}
}
3.索引的映射
定义字段名、字段类型(text、keyword、date、long、double、boolean、ip、completion、geo_point……)
定义索引规则
PUT demo.12345
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"_doc" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
}
查看索引:GET demo.12345/_mapping
删除索引:DELETE demo.12345
四、ES分布式架构
节点:
一个集群由多个节点组成,每个节点指定相同的cluster.name
主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等
一个节点是一个ES实例,默认每个节点都可为候选主节点与数据节点,即:
node.master: true
node.data: true
索引:
分片:
分片
索引是指向一个或多个分片的逻辑命名空间
最小级别的工作单元,一个Lucene实例(倒排索引)
主分片
静态不可变
索引首先被存储在主分片中,然后复制相应的副本分片
副本分片
动态可修改
用于故障转移,一旦主分片失效,副本分片晋升为主分片
副本:
五、ES搜索方式
1、URI Search:简易方式,可临时使用,不适合构建复杂查询
GET /索引/类型/_search 查询所有
GET /索引/类型/_search
{"query":{"match_all":{}}}
GET /索引/类型1?_source=字段列表 只展示哪个或哪几个
GET /索引/类型/_search
{
"query":{
"match":{json串}
}
}
2、Query DSL(Domain Specific Language)基于JSON的查询语言
叶查询子句(Leaf query clauses)
用于在特定字段中查找特定值
match查询
term查询
range查询
复合查询子句(Compound query clauses)
可以包含叶子或者其它的复杂查询语句
bool查询
match_all:返回所有文档
GET stu/_search
{
"query": {
"match_all": {}
}
}
match:布尔匹配查询;对查询字符串进行分词,根据分词结果构造布尔查询
GET stu/_search
{
"query": {
"match": {
"name":"John Kerry"
}
}
}
match_phrase:短语匹配查询;对查询字符串进行分词,字段值必须依次匹配所有分词,注意各分词位置不能改变
GET stu/_search
{
"query": {
"match_phrase": {
"name":"John Kerry"
}
}
}
match_phrase_prefix:短语前缀匹配查询;类似match_phrase,但最后一个分词作为前缀匹配
GET stu/_search
{
"query": {
"match_phrase_prefix": {
"name":"John Ke"
}
}
}
multi_match:多字段匹配查询
GET stu/_search
{
"query": {
"multi_match": {
"query": "John like cooking",
"fields": ["name","interest"]
}
}
}
term:词条查询;按照存储在倒排索引中的确切字词,对字段进行匹配
GET stu/_search
{
"query": {
"term":{
"name":"john" #注意:值全部为小写
}
}
}
terms:多词条查询;按照存储在倒排索引中的确切字词,对字段进行多词条匹配
GET stu/_search
{
"query": {
"terms":{
"name":["john","da"]
}
}
}
range:范围查询
GET stu/_search
{
"query": {
"range" : {
"yearOfBorn" : {
"gte" : 1995,
"lte" : 2000
}
}
}
}
bool:布尔查询
查询喜欢“cooking”且不在1995-2000间出生的学生
GET stu/_search
{
"query": {
"bool": {
"must": {
"match": { "interest": "cooking"} },
"must_not": {
"range": { "yearOfBorn": { "gte": 1995, "lte": 2000 }}}
}
}
}
六、分页
from+size浅分页
方式一:
GET stu/_search?size=5
GET stu/_search?size=5&from=5 # from:数据下标是从0开始的,表示从第几个数据开始
方式二:
GET stu/_search
{
"query": {
"match_all": {}
},
"size": 5,
"from": 0 #取出所有文档,截取前5条
}
scroll深分页
scroll深分页:保存结果快照,需要分页时,直接从结果中获取
返回scroll_id与第一页内容,scroll_id 5分钟有效
GET stu/_search?scroll=5m
{
"from": 0,
"size": 5,
"query": {"match_all": {}}
}
根据scroll_id不断获取下一页内容
GET _search/scroll
{
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAANy……",
"scroll": "5m"
}