ES基础概念:
node:
节点,部署es程序的服务器
cluster:
集群,多个节点组成的架构
shard:
索引分片,索引可以被设置为多个分片
replicas:
索引副本
index:
索引,相当于关系型数据库的database
type:
类型,对应于关系型数据库的table
mapping:
映射关系,相当于数据库中的表结构
document:
文档,类似于关系型数据库的row
查询文档时的三元素
_index:文档对应的索引
_type:文档对应的数据类型
_id:文档的唯一ID
示例:GET /hxcar/car/1
GET /_index/_type/_id
用es的话说表示:查询_index索引为hxcar的,_type为car的,_id为1的document。
用数据库的话说表示:查询数据库名为hxcar的,表为car的,id列为1的信息。
ES命令分类
索引管理:
创建,配置,删除索引
文档关系:
创建,修改,删除文档
数据查询:
空查询
指定索引查询,指定类型查询
请求体查询(过滤查询,匹配度查询)
ES请求方式
GET:
数据查询
POST(适合添加操作,应为可以不指定document可以参考最后的代码块):
数据查询,数据新增,数据修改
PUT(创建索引只能用PUT):
数据新增,数据修改
DELETE:
数据删除
索引管理
#创建一个yjw的索引(数据库表示:创建一个yjw的数据库)
PUT yjw
{
"settings": {
#副本数
"number_of_replicas": 1,
#分片数
"number_of_shards": 5
},
"mappings": {
#创建yjw下的一个type为user(数据库表示:在yjw库中创建user表)
"user": {
"properties": {
#创建name字段类型为text,并指定分词为ik_smart分词器
"name": {
"type": "text",
"analyzer": "ik_smart"
},
#创建sex字段类型为text
"sex":{
"type": "text"
}
}
}
}
}
数据类型
5.x版本取消掉string
分词器类型
StandardAnalyzer默认分词器不支持中文分词,因此需要中文全文检索时需要配置中文分词器例如:IK分词器
数据查询
查询结果分析:
took:搜索耗时,单位毫秒
_shards:查询中参数与分片的总数,以及这些分片成功和失败的个数
time_out:表示查询是否超时
hist:查询出的结果集,数据为json格式
请求体查询:
请求体查询一般使用query子句进行实现。
直接放倒query体会进行打分操作。
查询分类:
过滤查询:
对文档进行匹配,不分词,常用filter+其他子句实现
匹配度查询:
对文档进行匹配并打分,分词,常用macth子句实现
query体查询子句
match子句
term子句
range子句
#term匹配查找
#range范围查找
示例:见底图。
组合查询
定义:同时对多个字段进行匹配检索,并且根据一系列的标准过滤的复合查询。
实现方式:bool子句
bool子句:must,must_not,should,filter
must:文档必须匹配这些条件才能被包含进来
must_not:文档必须不匹配这些条件才能被包含进来
should:如果文档满足should内的条件,将为改文档增加_score,否则无任何影响
filter:使用过滤模式来进行查询
分页查询
from:开始,size:页大小
小结:
node(节点),cluster(集群),index(索引),type(表),document(文档),shard(索引分片),replicas(索引副本)
ex查询三要素:_index,type,_id
es常用命令:索引操作,文档操作,数据查询操作
查询请求体:query
精准查询:term,terms(去查找匹配的值没有分词这个概念,即:_score = 1)
get yjw/car/_search
{
"query":{
#term:"term":{"loginName":"admin"}
"terms":{"loginName":["ad","admin"]}
}
}
匹配度查询:match(该查询有分词这个概念会对条件值进行分词,后去查询匹配的值,即:_score != 1)
get yjw/car/_search
{
"query":{
#分词为蒙迪欧,领克03进行匹配
"match":{"series":"蒙迪欧 领克03"}
}
}
范围查询:range
get yjw/car/_search
{
"query":{
#gte,lte包含11和33 gt,lt不包含
"range":{"price":{"gte":11,"lte": 33}
}
}
组合查询:bool
过滤查询:filter(不计算相关性也就是不进行打分,可以做cache,查询快于query,放入query块里的会进行打分操作,所以在filter子句上加了一个bool)
{"query":{"bool":{"filter":[{"term":{"carType":"跑车"}},{"range":{"price":{"gte":30,"lte":50}}}]}}}
匹配查询:must(相当于数据库中的and)
{"query":{"bool":{"filter":[{"term":{"carType":"跑车"}},{"range":{"price":{"gte":30,"lte":50}}}],"must_not":[{"term":{"year":"2017"}},{"term":{"changeOwner":"false"}}],"must":[{"term":{"year":"2020"}},{"term":{"changeOwner":"true"}}]}}}
不匹配查询:must_not(相当于数据库中的not)
{"query":{"bool":{"filter":[{"term":{"carType":"跑车"}},{"range":{"price":{"gte":30,"lte":50}}}],"must_not":[{"term":{"year":"2017"}},{"term":{"changeOwner":"false"}}],"must":[{"term":{"year":"2020"}},{"term":{"changeOwner":"true"}}]}}}
或匹配查询:should(相当于数据库中的or)
{"query":{"bool":{"filter":[{"term":{"carType":"跑车"}},{"range":{"price":{"gte":30,"lte":50}}}],"must_not":[{"term":{"year":"2017"}},{"term":{"changeOwner":"false"}}],"must":[{"term":{"year":"2020"}},{"term":{"changeOwner":"true"}}],"should":[{"term":{"year":"2019"}},{"term":{"changeOwner":"true"}}]}}}
排序:sort
{
"query":{term:"term":{"loginName":"admin"}},
"sort": {"createTime":{"order":"desc"}}
}
非空查询:exists:field
{"query":{"exists":{"field":"areaCode"}}}
示例:
#查询所有
GET _search
#ik分词器的两种方式
#穷举的方式
GET _analyze
{
"text": "中华人民共和国中央政",
"analyzer": "ik_max_word"
}
#智能的方式
GET _analyze
{
"text": "中华人民共和国中央政",
"analyzer": "ik_smart"
}
#查询已创建的索引
GET /_cat/indices?v
#删除索引
DELETE yjw
#添加索引只能用PUT
PUT /yjw
{
"settings": {
"number_of_replicas": 0,
"number_of_shards": 5
},
"mappimgs": {
"user": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"age": {
"type": "integer"
},
"address": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
#增加字段的方法
PUT 索引/_mapping/type
{
"properties":{
"tsCount":{
"type":"integer"
},
"dyCount": {
"type": "integer"
}
}
}
#PUT不接受不带document(01)的语法,这就是PUT和POST的区别
PUT /yjw/user/01
{
"name":"yjw",
"age":222,
"address":"州"
}
POST /yjw/user
{
"name":"yjw",
"age":222,
"address":"杭州"
}
#根据index/type/document查询具体的行
GET /yjw/user/01
#根据index/type/document删除
DELETE /yjw/user/01
#根据index/type/查询所有
GET /yjw/user/_search
#直接放倒query体会进行打分操作,filter没有这个功能所以不能放到query体里
#term匹配查找
#range范围查找
#过滤查询
GET /yjw/user/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
}
}
#匹配度查询
GET /yjw/user/_search
{
"query": {
"match": {
"address": "杭"
}
}
}
#复合查询
GET /yjw/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "杭"
}
}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 2000
}
}
}
}
}
}
#分页查询
GET /yjw/user/_search
{
"from": 0,
"size": 1,
"query": {
"bool": {
"must": [
{
"match": {
"address": "杭"
}
}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 2000
}
}
}
}
}
}