1.創建索引
# 語法:
PUT /<index>
# 示例:
PUT /laowang
PUT xiaowang
2.創建數據
# 語法
PUT /<index>/_doc/<_id>
POST /<index>/_doc/
PUT /<index>/_create/<_id>
POST /<index>/_create/<_id>
index:索引名稱,如果索引不存在,會自動創建
_doc:類型
<_id>:唯一識別符,創建一個數據時,可以自定義ID,也可以讓他自動生成
# ES 存儲數據三個必要構成條件,每一條數據必須有以下的數據結構
構成條件 | 說明 |
---|---|
_index | 索引(數據存儲的地方) |
_type | 類型(數據對應的類) |
_id | 數據唯一標識符 |
3.指定 ID 插入數據(PUT)
PUT /student/user/4
{
"name":"congtianqi",
"sex":"male"
}
# 一般不用此方式插入數據
# —— 需要修改 ID 值
# —— 當指定 ID 時,插入數據時會查詢數據對比 ID 值,若 ID 相同,則會覆蓋更新原來的數據
4.隨機ID插入數據(post)
# ES 會隨機生成一個較長字符串作為此條數據的唯一 ID 標識
POST /student/user/
{
"name":"xiaoliu",
"gender":"female"
}
5.添加指定字段
# 推薦使用方法
POST /student/user/
{
"id":"1",
"name":"xiaoliu",
"gender":"female"
}
6.查詢數據
1.簡單查詢
# 查看所有索引信息
GET /_all
GET _all
# 查看所有索引的數據
GET /_all/_search
# 查看指定索引信息
GET /student
# 查看指定索引的數據
GET /student/_search
# 查看指定數據
GET /student/user/1
2.條件查詢
1). —term 代表完全匹配,也就是精確查詢,搜索前不會再對搜索詞進行分詞,例如,我們要搜索標題(title)為 "北京烤鴨" 的所有文檔:
# 方法一:
GET /news/_search
{
"query": {
"term": {
"title": {
"value": "北京烤鴨"
}
}
}
}
# 可以省略 value 行,與 Key 合並到一行
GET /news/_search
{
"query": {
"term": { <-------- 使用 term 匹配,適用於精確查找
"title":"北京烤鴨" <------- 簡寫,並為一行
}
}
}
2). — match 代表模糊匹配,先對搜索詞進行分詞,例如,我們要搜索標題(title)為 "北京烤鴨" 的文檔時,會先將 "北京烤鴨" 分詞為 "北京" 和 "烤鴨",符合兩者其一的,都會取到結果:
# 方法二:
GET /news/_search
{
"query": {
"match": { <-------- 使用 match 匹配,適用於模糊查找
"title": "北京烤鴨"
}
}
}
3.多條件查詢(Bool)
Bool 查詢現在包括四種子句:must,filter,should,must_not
1).Bool 查詢現在包括四種子句:must,filter,should,must_not
# 查詢條件必須全部滿足
GET /student/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"age": {
"value": "23"
}
}
},
{
"term": {
"name": {
"value": "wqh"
}
}
}
]
}
}
}
2).— filter 查詢:查詢條件必須全部滿足,類似 SELECT 語句中的 AND,與 must 不同的是,不會計算相關性分數:
# 跟 must 一樣,在數據量很大時,比 must 查詢快一點,因為不用計算相關分
GET /student/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"age": {
"value": "23"
}
}
},
{
"term": {
"name": {
"value": "wqh"
}
}
}
]
}
}
}
3).— should 查詢:查詢條件滿足其一即可,類似 SELECT 語句中的 OR,會計算相關性分數:
# 多條件查詢時,查詢條件只要有一個滿足就可以
GET /student/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"age": {
"value": "23"
}
}
},
{
"term": {
"name": {
"value": "wqh"
}
}
}
]
}
}
}
4).— must_not 查詢:查詢條件必須不滿足,類似 SELECT 語句中的 NOT,會計算相關性分數:
# must_not 中的條件,必須全部不滿足
GET /student/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"age": {
"value": "23"
}
}
},
{
"term": {
"name": {
"value": "wqh"
}
}
}
]
}
}
}
5). — must + should 查詢:
# 查詢年齡是 23歲 或者年齡是 18歲 並且名字是 j 的數據
GET /student/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"age": {
"value": "23"
}
}
},
{
"bool": {
"must": [
{
"term": {
"age": {
"value": "18"
}
}
},
{
"term": {
"name": {
"value": "wqh"
}
}
}
]
}
}
]
}
}
}
6).范圍查詢:
GET /student/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"age": {
"gte": 20,
"lte": 25
}
}
}
]
}
}
}
7.修改數據
# 修改數據時指定 ID 修改
PUT /student/user/1
{
"name":"霧山火行",
"gender":"male",
"age":"18"
}
# 注意,修改數據時,除了要修改的值,其他字段的值也要帶上,否則原有的其他字段會丟失
PUT /student/user/2
{
"name":"wqh",
"gender":"male",
"age":"19"
}
8.刪除數據
# 刪除指定 ID 數據
DELETE /student/user/4
# 刪除索引(別瞎刪,可以用 ES-head 關閉索引)
DELETE /student
9.總結
Query Context(不帶 Filter) 與 Filter Context#
①. — Query Context 即指所有不使用 Bool 查詢中的 Filter(過濾器)的上下文查詢
②. — Filter Context 指 Bool 查詢中,使用 Filter(過濾器)的上下文查詢
查詢在 Query 查詢上下文和 Filter 過濾器上下文中,執行的操作是不一樣的:
①. — 查詢上下文:是在使用 query 進行查詢時的執行環境,比如使用 search 的時候。
在查詢上下文中,查詢會回答這個問題——“這個文檔是否匹配,它的相關度高么?”
ES中索引的數據都會存儲一個 _score 分值,分值越高就代表越匹配。即使 lucene 使用倒排索引,對於某個搜索的分值計算還是需要一定的時間消耗 。
②. — 過濾器上下文:在使用 filter 參數時候的執行環境,比如在 bool 查詢中使用 Must_not 或者 filter
在過濾器上下文中,查詢會回答這個問題——“這個文檔是否匹配?”
它不會去計算任何分值,也不會關心返回的排序問題,因此效率會高一點。
另外,經常使用過濾器,ES會自動的緩存過濾器的內容,這對於查詢來說,會提高很多性能。
總而言之:
①. — 查詢上下文:查詢操作不僅僅會進行查詢,還會計算分值,用於確定相關度;
②. — 過濾器上下文:查詢操作僅判斷是否滿足查詢條件,不會計算得分,查詢的結果可以被緩存,所以速度快
所以,根據實際的需求是否需要獲取得分,考慮性能因素,選擇不同的查詢子句;如果不需要獲得查詢詞條的相關性分數,盡量使用 Filter 。