[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緩存執行原理圖

匹配的結果會放在Bigset這個數組,匹配上就記為1,沒匹配上就為0

- 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)
- 異步確保型
- 最大努力通知型
- 總結