ElasticSearch 基本概念 and 索引操作 and 文件操作 and 批量操作 and 結構化查詢 and 過濾查詢(轉載)
阿新 • • 發佈:2020-07-31
基本概念
索引:
類似於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