上一篇已經安裝Elasticsearch的兩個節點 和 Kibana現在進行簡單的操作
簡單理解對應為關系型數據庫的 數據庫 表 一行記錄
如果在postMan中操作需要根據上圖的方式來進行操作
分片shard是es分布式系統的高可用方案 es會將一份數據進行分片自己理解為分解數據房租不同的機器上(默認為5份可以配置) 備份shard默認為1也就是每個分片都有一個備份,如果其中的一個分片宕機的話將由備份進行其他的請求操作實現高可用 , 相同的分片不能和相對於的備份存儲在一台機器當中。
PUT /people 創建一個 人 的索引
POST /people/man/ 為索引添加數據 類型會自動創建
{
"name":"redis",
"school":"qinghua",
"introduce":"我是我是我jianqiao",
"age":28,
"birthday":"1996-06-22",
"score":479
}
現在修改數據 有兩個rabbitmq修改為scala
POST /people/man/AWs_LjUOYHh6lG16ttAd/_update
{
"doc": {
"name":"scala"
}
}
kibana還是挺方便的可以自動補全
文檔刪除
刪除索引可以在head中操作也可以腳本
-----------------------------查詢是es的比較強的一個點-------------------------------
GET _search
{
"query": {
"match_all": {}
}
} 查詢所有
-----------------------------
GET _search
{
"query":{
"match_all":{
}
},
"from":1,
"size":3
} 添加分頁 from從第幾個開始size幾個
--------------------------
GET _search
{
"query":{
"match_all":{
}
},
"sort":[
{
"age":{
"order":"desc"
}
}
],
"_source":[
"age"
]
} 根據年齡排序 _source顯示相關的字段即可 查看更方便
-------------------------
GET _search
{
"query":{
"match":{
"name":"elasticSearch入門 "
}
}
} es會將elasticSearch入門 進行拆分為elasticSearch和入門 進行匹配只要匹配其中一個都會進行返回
---------------------
GET _search
{
"query":{
"match_phrase":{
"name":"rabbitmq"
}
}
} 這個是完整匹配必須一模一樣的才進行返回如 rabbitmq rabbitmq A 但是rabbitAmq不行
-------------------------------------------------
GET _search
{
"query":{
"terms":{
"name":[
"php",
"ajax"
]
}
}
} 查詢名字是php 和ajax的doc 完全匹配
GET _search
{
"query":{
"term":{
"score":"479"
}
}
}一個terms和term term會將作為一個完整的查詢匹配不會進行分詞匹配
------------------------------------------------------
GET _search
{
"range":{
"score":{
"gte":400,
"lte":500
}
}
}
}
范圍查詢400-500分數的doc 可以比較時間now表示當前時間
-----------------------------------------------------
GET _search
{
"size":0,
"aggs":{
"group_haha":{
"terms":{
"field":"age"
}
}
}
} 聚合查詢查詢相同年級的人數有多少個 group_haha隨便定義都可以
GET _search
{
"size":0,
"aggs":{
"group_haha":{
"terms":{
"field":"age"
}
},
"group_hehe":{
"terms":{
"field":"score"
}
}
}
}可以進行多個聚合同時返回
-------------------------
GET _search
{
"size":0,
"aggs":{
"group_stats":{
"stats":{
"field":"score"
}
}
}
} 可以進行計算返回最大最小平均總和也可以直接查詢最小 將關鍵字stats、改為min或max
GET /tvs/sales/_search
{
"size":0,
"query":{
"term":{
"brand":{
"value":"小米" 先進行篩選
}
}
},
"aggs":{
"group_by_color":{
"terms":{
"field":"color" 對篩選的數據進行聚合
}
}
}
}
按每種顏色的平均銷售額降序排序
GET /tvs/sales/_search
{
"size":0,
"aggs":{
"group_by_color":{
"terms":{
"field":"color",
"order":{
"avg_price":"asc"
}
},
"aggs":{
"avg_price":{
"avg":{
"field":"price" //計算出每種顏色的平均價然后進行排序
}
}
}
}
}
}
--------------------------
GET _search
{
"query":{
"multi_match":{
"query":"java",
"fields":[
"introduce",
"name"
]
}
}
} multi_match名稱和介紹包含java就符合條件
后加
GET /forum/article/_search
{
"query":{
"multi_match":{
"query":"java solution", //搜索這兩個關鍵詞
"type":"best_fields",
"fields":[
"title^2",
"content"
], //title^2 boost為2 匹配title的權重會更高一點
"tie_breaker":0.3, //深入6中有詳解
"minimum_should_match":"50%"//至少匹配一個
}
}
}
------------------------------------------------------
GET _search
{
"query":{
"query_string":{
"fields":[
"introduce"
],
"query":"java and jianqiao"
}
}
}
GET _search
{
"query":{
"query_string":{
"query":"(java and jianqiao) OR scala"
}
}
}
語法查詢感覺這個比較強大可以使用關鍵字 and 和or fields可以去除可以多個,去除之后查詢整條doc
解釋: query_string直接可以搜索所有的field,任意一個field包含指定的關鍵字就可以搜索出來。我們在進行中搜索的時候,難道是對document中的每一個field都進行一次搜索嗎?不是的
es中的_all元數據,在建立索引的時候,我們插入一條document,它里面包含了多個field,此時,es會自動將多個field的值,全部用字符串的方式串聯起來,變成一個長的字符串,作為_all field的值,同時建立索引
后面如果在搜索的時候,沒有對某個field指定搜索,就默認搜索_all field,其中是包含了所有field的值的
舉個例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guamgzhou"
}
"jack 26 jack@sina.com guangzhou",作為這一條document的_all field的值,同時進行分詞后建立對應的倒排索引
-----------------------------
GET _search
{
"query":{
"bool":{
"filter":{
"term":{
"age":"19"
}
}
}
}
}
過濾查詢只查看年齡是19歲的doc term 和terms都可以 bool多個條件組合的使用
單獨使用filter
{
"query":{
"constant_score":{
"filter":{
"range":{
"age":{
"gte":10,
"lte":30
}
}
},
"boost":1.2
}
}
}
--------------------------------------
前綴查詢
{
"query":{
"prefix":{
"name":"sc"
}
}
}
--------------------------------------------------------
標識符查詢針對多個id
{
"query":{
"ids":{
"values":[
"111",
"2",
"3"
]
}
}
}
--------------------------------------------
使用編輯距離的模糊查詢,計算量較大,但是對用戶拼寫錯的場景比較有用
{
"query":{
"fuzzy":{
"name":"abax" //查詢出ajax
}
}
}
-------------------------------------------
支持*和?等通配符 ?:任意字符 *:0個或任意多個字符
{
"query":{
"wildcard":{
"name":"aj*x"
}
}
}
-------------------------------------------
GET _search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"php"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
} bool should應當滿足條件滿足其中一個就可以 或 || 可以滿足條件也可以不滿足
-------------------------------------------------------
GET _search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"php"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
} 兩個條件都要滿足 與的關系
-----------------------------------------------------
GET _search
{
"query":{
"bool":{
"must_not":[
{
"term":{
"name":"php"
}
}
]
}
}
} 不顯示不看名稱是php的doc
使用bool組合查詢
接受以下參數:
must:文檔必須匹配設定條件才能被包含進來
must_not:文檔必須不匹配設定條件才能被包含進來
should:如果滿足語句中的任意語句,將增加_source,否則,無任何影響。主要用於修正每個文檔的相關性得分
filter:必須匹配,但以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標准來排除或包含文檔
must:必須包含的條件,must not:不包含 ,should:包含的話會更匹配
------------------------批量操作------------------------
GET /_mget
{
"docs":[
{
"_index":"people",
"_type":"man",
"_id":"AWs_K3KEYHh6lG16ttAX"
},
{
"_index":"people",
"_type":"man",
"_id":"AWs_LJiZYHh6lG16ttAZ"
}
]
} 一次查詢多條doc
GET /people/_mget
{
"docs":[
{
"_type":"man",
"_id":"AWs_K3KEYHh6lG16ttAX"
},
{
"_type":"wuman",
"_id":"AWs_LJiZYHh6lG16ttAZ"
}
]
} 一次查詢多條doc 可以指定不同的type
GET /people/man/_mget
{
"ids":["AWs_LJiZYHh6lG16ttAZ"]
}
如果都在同一個index和type中指定ids查詢
在查詢多條記錄的時候使用mget可以提升es的銷量
-------------------------------------------------------------------
舉例,比如你現在要創建一個文檔,放bulk里面,看起來會是這樣子的:
{"index": {"_index": "test_index",:"_type", "test_type", "_id": "1"}}
{"test_field1": "test1", "test_field2": "test2"}
有哪些類型的操作可以執行呢?
(1)delete:刪除一個文檔,只要1個json串就可以了
(2)create:PUT /index/type/id/_create,強制創建
(3)index:普通的put操作,可以是創建文檔,也可以是全量替換文檔
(4)update:執行的partial update操作
POST /_bulk
{"delete":{"_index":"people","_type":"man","_id":"AWs_LV1RYHh6lG16ttAb"}} //刪除doc
{"create":{"_index":"people","_type":"man","_id":"111"}} //創建doc
{ "name":"Elasticsearch","school":"anhui","introduce":"我是我是我Elasticsearch","age":20,"birthday":"1996-06-22","score":434} //編寫數據
{"update":{"_index":"people","_type":"wuman","_id":"AWtFEmkP1ihNSp8xGbqK","_retry_on_conflict":"3"}} //修改doc
{"doc":{"introduce":"大家好dajiahao大家好大家好大家好我是NODEJS"}} //編寫修改的數據
bulk api對json的語法,有嚴格的要求,每個json串不能換行,只能放一行,同時一個json串和一個json串之間,必須有一個換行/與mget類似 路徑上添加了index和type的話 操作語法中就可以不加
bulk操作中,任意一個操作失敗,是不會影響其他的操作的,但是在返回結果里,會告訴你異常日志
2、bulk size最佳大小
bulk request會加載到內存里,如果太大的話,性能反而會下降,因此需要反復嘗試一個最佳的bulk size。一般從1000~5000條數據開始,嘗試逐漸增加。另外,如果看大小的話,最好是在5~15MB之間。
GET /test_index/test_type/_validate/query?explain
{
"query":{
"math":{
"test_field":"test"
}
}
}
檢測語句是否合法
{
"valid": false,
"error": "org.elasticsearch.common.ParsingException: no [query] registered for [math]"
}
版本為5.2.0最新版本已經為7.X可能有差異,都是自學文章歡迎錯誤指正