1. 程式人生 > 實用技巧 >ElasticSearch 基本概念 and 索引操作 and 文件操作 and 批量操作 and 結構化查詢 and 過濾查詢(轉載)

ElasticSearch 基本概念 and 索引操作 and 文件操作 and 批量操作 and 結構化查詢 and 過濾查詢(轉載)

基本概念

索引:
    類似於MySQL的表。索引的結構為全文搜尋作準備,不儲存原始的資料。
    索引可以做分散式。每一個索引有一個或者多個分片 shard。每一個分片可以有多個副本 replica。
文件:
    類似與MySQL的一行記錄。
對映:
    所有文件寫入索引之前,會進行分析, 分析將輸入的文字進行分割為詞條,分析哪些詞條會被過濾。
文件型別:
    每個文件都可以有不同的結構。
    不同的文件類不能為相同的屬性設定不同的型別。
    【同一索引中所有文件型別中,一個title欄位必須是相同的型別】

索引操作

新增索引

建立不指定文件,文件型別的索引庫
PUT:127.0.0.1:9200/index_name

{
    "settings": {
        "index": {
            "number_of_shards": "2",
            "number_of_replicas": "0"
        }
    }
}

建立指定文件,文件型別的索引庫
PUT:127.0.0.1:9200/test_stu

{
    "settings": { 
        "index": {
            "number_of_shards": "2",
            "number_of_replicas": "0"
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "age": {
                "type": "integer"
            },
            "mail": {
                "type": "keyword"
            },
            "hobby": {
                "type": "text"
            }
        }
    }
}

檢視對映

GET:127.0.0.1:9200/test_stu/_mapping

刪除索引

DELETE:127.0.0.1:9200/index_name

文件操作

新增文件

POST:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
    
# 指定資料的唯一標示符
POST:127.0.0.1:9200/test/user/1001

{
    "id": 1001,
    "name": "張三",
    "age": 10,
    "sex": "男"
}

# 不指定資料的唯一標示符
POST:127.0.0.1:9200/test/user

{
    "id": 1002,
    "name": "張五",
    "age": 11,
    "sex": "男"
}

刪除文件

DELETE:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
說明:
刪除一個文件的時候不會立即從磁碟上移除,它只是被標記為已刪除。
Elasticsearch 將會在以後新增更多索引的時候才會在後臺進行刪除內容的清理。

修改文件

全域性覆蓋 
在 Elasticsearch 中,文件資料是不能被修改的,但是可以通過指定唯一標示符的方式進行覆蓋更新

PUT:127.0.0.1:9200/test/user/1001

{
  "id": 1010,
  "name": "張三",
  "age": 11,
  "sex": "男"
}
  
區域性更新
1、從舊文件中檢索到JSON;2、修改;3、刪除舊文件;4、索引新文件

POST:127.0.0.1:9200/test/user/1001/_update

{
    "doc":{
        "age": 100
    } 
}

查詢文件

查詢文件

根據ID搜尋資料
GET:127.0.0.1:9200/test/user/1001

獲取所有資料預設10條
GET:127.0.0.1:9200/test/user/_search

根據關鍵詞搜尋資料
GET:127.0.0.1:9200/test/user/_search?q=age:100

DSL搜尋

Elasticsearch 提供的豐富的靈活的查詢語言叫做DSL查詢【Query DSL】
filter 過濾
must 匹配 

POST:127.0.0.1:9200/test/user/_search

{
    "query": {
        "match": { 
            "age": 20
        }
    }
}

全文檢索

POST:127.0.0.1:9200/test/user/_search

{
    "query": {
        "match": { 
            "name": "三 五"
        }
    }
}

高亮顯示

POST:127.0.0.1:9200/test/user/_search

{
    "query": {
        "match": { 
            "name": "三 五"
        }
    },
    "highlight": {
        "fields": {
            "name": {}
        }
    }
}  

聚合操作

類似SQL中的 group by 操作
POST:127.0.0.1:9200/test/user/_search

{
    "aggs": {
        "all_interests": {
            "terms": {
                "field": "age"
            }    
        }
    }
}

判斷文件是否存在

HEAD:127.0.0.1:9200/test/user/1001
存在:HTTP狀態碼為200
不存在:HTTP狀態碼為404

批量查詢資料

POST:127.0.0.1:9200/test/user/_mget

{
    "ids": [ 1001, 1002  ]
}

批量新增資料

POST:127.0.0.1:9200/test/user/_bulk
注意:資料最後要有一個空行

{ "create": { "_index": "test","_type": "user","_id": 1010 }}
{ "id": 1010,"name": "1010","age": 10,"sex": "女" }
{ "create": { "_index": "test","_type": "user","_id": 1011 }}
{ "id": 1011,"name": "1011","age": 11,"sex": "女" }

批量刪除資料

POST:127.0.0.1:9200/test/user/_bulk
注意:資料最後要有一個空行

{ "delete": { "_index": "test","_type": "user","_id": 1010 }}
{ "delete": { "_index": "test","_type": "user","_id": 1011 }}

分頁

和SQL中使用LIMIT關鍵詞返回一頁的結果一樣。ELasticssearch接受from和size引數
size:結果數;預設是10
from:偏移量;預設是0

如果每頁顯示5條資料,頁碼從1到3,那請求分別如下:
GET:127.0.0.1:9200/test/user/_search?size=5
GET:127.0.0.1:9200/test/user/_search?size=5&from=5
GET:127.0.0.1:9200/test/user/_search?size=5&from=10

資料型別

自動判斷 

| JSON TYPE | Field type |
| :- | :- |
| Boolean:true or false | boolean |
| 123 | long |
| 123.45 | double |
| 2014-09-15 | date |
| "string" | string |

Elasticsearch 中支援的型別

| 型別 | 表示的資料型別 |
| ---- | ---- |
| string | string, text, keyword |
| whole number | byte, short, integer, long |
| floating point | float, double |
| boolean | boolean |
| date | date |

5.x 開始,不支援string,由 text 和 keyword 型別代替。
text 型別,當一個欄位需要被全文搜尋的時候,比如 Email內容,產品描述,應該使用 text型別。
設定 text 型別之後,欄位內容會被分析。
text 型別的欄位不用於排序,很少用於聚合。
keyword 型別適用於索引結構優化的欄位。比如 Email地址,主機名,狀態等。
keyword 型別的欄位只能通過準確值搜尋到。

結構化查詢 - term 精確查詢

主要用於精確匹配值。比如數字,日期,布林值,或者不能進行分詞的字串
例如:查詢年齡為16的學生
POST:127.0.0.1:9200/test_stu/_doc/_search

{
    "query": {
        "term": {
            "age": 16
        }
    }
}

結構化查詢 - terms 查詢

和 term 有點類似,但是 terms 允許指定多個匹配條件。
如果某個欄位指定了多個值,那麼文件需要一起去做匹配;
例如:查詢年齡為16和15的學生
POST:127.0.0.1:9200/test_stu/_doc/_search

{
    "query": {
        "terms": {
            "age": [16,15]
        }
    }
}

結構化查詢 - range 範圍查詢

gt:大於
gte:大於等於
lt:小於
let:小於等於

例如:查詢年齡在 15 到 22 之間的學生
POST:127.0.0.1:9200/test_stu/_doc/_search

{
    "query": {
        "range": {
            "age": {
                "gte": 15,
                "lte": 22
            }
        }
    }
}

結構化查詢 - exists 查詢

exists 查詢用於查詢文件中是否包含指定欄位。

例如:查詢文件中是否包含 title 欄位
POST:127.0.0.1:9200/test_stu/_doc/_search
{
    "query": {
        "exists": {
            "field": "title"
        }
    }
}

結構化查詢 - match 標準查詢

match 查詢是一個標準查詢,不管你是否需要全文檢索還是精準查詢都可以使用。

例如:查詢年齡為15歲的使用者
POST:127.0.0.1:9200/test_stu/_doc/_search
{
    "query": {
        "match": {
            "age": 15
        }
    }
}

結構查詢 - bool 查詢

bool 查詢可以用來合併多個條件查詢結果的布林邏輯,包含以下邏輯:
must 多個查詢條件的完全匹配,相當於 and; 
    "must": {
        "match": { "hobby": "跑步" }
    }
must_not 多個查詢條件的相反匹配,相當於 not;
    "must_not": {
        "match": { "hobby": "跑步" }
    }
should:至少有一個查詢條件匹配,相當於 or;
    "should": {
        "match": { "hobby": "跑步" }
        "match": { "hobby": "爬山" }
    }

例如:查詢姓名中包含六且愛好不包含跑步的資料
POST:127.0.0.1:9200/test_stu/_doc/_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "name": "六"
                }
            },
            "must_not": {
                "match": {
                    "hobby": "跑步"
                }
            }
        }
    }
}

過濾查詢 filter 查詢

例如:查詢年齡為20的使用者
POST:127.0.0.1:9200/test_stu/_doc/_search
{
    "query": {
        "bool": {
            "filter": {
                "term": {
                    "age": 15
                }
            }
        }
    }
}

查詢和過濾對比:

多慮語句會詢問每個文件的欄位值是否包含著特定值;
查詢語句會詢問每一個文件的欄位值與特定值的匹配程度如何;
查詢語句不僅要查詢匹配的文件,還需要計算每個文件的相關性;
所以一般來說查詢語句要比過濾語句更耗時,並且查詢結果也不可快取。

建議:

做精確匹配搜尋的時候,最好使用過濾語句,因為過濾語句可以快取資料。

新增報錯

1、新增資料出錯
報錯: [FORBIDDEN/12/index read-only/allow delete (api)];
原因: 這個索引是隻讀狀態。
解決: PUT:http://127.0.0.1:9200/索引名稱/_settings
{
    "index.blocks.read_only_allow_delete": false
}

2、建立索引報錯
報錯: Root mapping definition has unsupported parameters
原因: ElasticSearch 7.x 預設不在支援指定索引型別;預設索引型別是_doc