[TOC]
# 简介
关系型数据库查询有where语句,可以找到我们想要的数据
filter和这个类似
filter查询能拿到我们想要的数据,查到的数据会缓存在内存中cache缓存
建立测试数据
~~~
POST /store/products/_bulk
{"index":{"_id":1}}
{"price":10,"productID":"SD1002136"}
{"index":{"_id":2}}
{"price":20,"productID":"SD2678421"}
{"index":{"_id":3}}
{"price":30,"productID":"SD8897573"}
{"index":{"_id":4}}
{"price":30,"productID":"SD4535233"}
~~~
查看测试数据
~~~
GET /store/products/_mget
{
"ids": ["1","2","3","4"]
}
~~~
查看library的mapping信息
~~~
GET /store/_mapping
~~~
# 简单过滤查询
## 最简单filter查询
~~~
select document from products where price = 20
~~~
filtered查询价格是20的商品
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"price": "20"
}
}
}
}
}
~~~
也可以指定多个值
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"terms": {
"price": [10,20]
}
}
}
}
}
~~~
~~~
select product from products where productID = "SD4535233"
~~~
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"productID":"SD4535233"
}
}
}
}
}
~~~
这个没有命中任何结果
我们看下mapping,发现是有的,是被分析的
查看分析器解析的结果
~~~
GET /_analyze?text=SD4535233
~~~
发现分析的结果是sd4535233
我们删除他,重新建立映射
~~~
DELETE /store
PUT /store
{
"mappings": {
"products":{
"properties": {
"productID": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
~~~
然后他不被分析,他就不是小写,因为分析的时候,会把他小写,或者分段
## bool过滤查询,可以做组合过滤查询
~~~
select product from products where (price = 20 or productID= "SD1002136") and (price != 30);
# 查询价格等于20的或者productID为SD1002136的商品,排除价格30元的
~~~
类似的,elasticsearch也有and,or,not这样的组合条件的查询方式
格式如下
~~~
{
"bool": {
"must":[],
"should":[],
"must_not":[],
}
}
~~~
must条件必须满足,相当于and
should:条件可以满足也可以不满足,相当于or
must_not:条件不需要,相当于not
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{"term": {"price": 20}},
{"term": {"productID": "SD1002136"}}
],
"must_not": {
"term": {"price": 30}
}
}
}
}
}
}
~~~
## 嵌套查询
~~~
select document from products where productID="SD1002136" OR (productID = "SD4535233" and price = 30);
~~~
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{"term": {"productID": "SD1002136"}},
{ "bool": {
"must": [
{"term": {"productID": "SD4535233"}},
{"term": {"price": "30"}}
]
}}
]
}
}
}
}
}
~~~
另外一种,and,or,not查询
没有bool,直接使用and, or, not
查询价格即是10元,productID又为SD1002136的结果
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"and": [
{
"term": {
"price":10
}
},
{
"term": {
"productID":"SD1002136"
}
}
]
},
"query": {
"match_all": {}
}
}
}
}
~~~
or
查询价格是10元或productID是SD1002136的一些商品
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"or": [
{
"term": {
"price":10
}
},
{
"term": {
"productID":"SD1002136"
}
}
]
},
"query": {
"match_all": {}
}
}
}
}
~~~
not
查询productID不是SD1002136的商品
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"not": {
"term": {
"productID": "SD1002136"
}
}
},
"query": {
"match_all": {}
}
}
}
}
~~~
# range范围过滤
~~~
select document from products where price between 20 and 40
gt : > 大于
lt : < 小于
gte : >= 大于等于
lte : <= 小于等于
~~~
~~~
GET /store/products/_search
{
"query": {
"filtered": {
"filter": {
"range": {
"price": {
"gte": 20,
"lte": 40
}
}
}
}
}
}
~~~
# 过滤空和非空
建立测试数据
~~~
POST /test_index/test/_bulk
{"index": {"_id":"1"}}
{"tags":["search"]}
{"index": {"_id":"2"}}
{"tags":["open_source"]}
{"index": {"_id":"3"}}
{"other_fields":"some data"}
{"index": {"_id":"4"}}
{"tags":null}
{"index": {"_id":"5"}}
{"tags":["search",null]}
~~~
处理null空值的方法
~~~
select tags from test where tags is not null
select tags from test where tags is null
~~~
~~~
GET /test_index/test/_search
{
"query": {
"filtered": {
"filter": {
"exists": {"field": "tags"}
}
}
}
}
~~~
~~~
GET /test_index/test/_search
{
"query": {
"filtered": {
"filter": {
"missing": {"field": "tags"}
}
}
}
}
~~~
# cache缓存
elasticsearch在执行带有filter查询时,会打开索引的每个segment文件(Luncene式底层文件),然后去判断里面的文档是否符合filter要求
注意:旧的segment文件不会变,新来的数据会产生新的segment
匹配的结果会用一个大型的BigSet数组来存储,这个数组的值只有0和1
匹配:1
不匹配:0
BigSet值是存在内存里的,而不是硬盘里,所以速度快
开启方式:在filter查询语句后面加`"_cache":true`
注意:
Scriptfilters,Geo-filters,Date ranges这样的过滤方式开启cache无意义
exists,missing,range,term和terms查询是默认开启cache的
filter cache缓存执行原理图
![](https://box.kancloud.cn/a166734573c7198f005eb2ed7be850b9_871x301.png)
匹配的结果会放在Bigset这个数组,匹配上就记为1,没匹配上就为0
![](https://box.kancloud.cn/2ba2f494524233d5db079c5c7b9175a1_386x303.png)
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结