第一次接觸es是19年做一個知識庫專案,業務需要模糊匹配和搜尋推薦。Mysql的查詢不能滿足像搜尋北京站返回北京火車站的場景,公司引入了es-分散式索引。
一.分散式索引引數介紹
1.number_of_shards:分片數量,不可更改。主要響應寫操作,如果調整分片數那就要重建索引。
2.number_of_replicas:副本數,可以修改,用於備份分片的,主要響應讀操作,副本越多讀取就越快。
3.es基礎型別
text:字串型別,可以被分詞keyword:不能被分詞,可以精確匹配的字串,keyword還支援字串陣列date:日期型別,通常配合format使用{"type":"date","format":"yyyy-MM-dd HH:mm:ss"}longintegershortfloatdoublearray:陣列型別object:一般是json結構ip:ip地址geo_point:地理位置等
大家使用時可以根據檢視官網型別
二.es基礎語法
es支援JSON格式的查詢叫做dsl-domain specific language,剛開始比較難理解,下面通過幾個簡單的例子開始
1.建立索引 學員表索引 es6.x版本預設5個分片一個副本,可根據資料量自行設定;
mappings:索引欄位設定,和mysql表字段一致
PUT /student{ "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "_doc": { "properties": { "name": { "type": "keyword" }, "code": { "type": "keyword" }, "age": { "type": "integer" } } } }}
2.修改副本數 副本數可以修改,分片數不能修改
PUT /student/_settings{ "number_of_replicas": 3}
3.檢視索引settings 和 mappings 屬性
GET student/_settings
GET student/_mapping
4.insert資料,指定id建立 PUT請求 /index/index_type/文件id,不指定id,es會預設生成20位字串id
PUT /student/_doc/1 { "name": "小紅", "age": 10, "code":"1"}
PUT /student/_doc/2{ "name": "小剛", "age": 11, "code":"2"}
PUT /student/_doc/3{ "name": "小李", "age": 10, "code":"3"}
PUT /student/_doc/4{ "name": "小強", "age": 10, "code":"4"}
5.update資料
5.1指定id部分欄位修改 將小紅改為小紅1
POST /student/_doc/1/_update{ "doc":{ "name":"小紅1" }}
5.2.指定id全量修改索引 文件1的資料全量被覆蓋
PUT /student/_doc/1{ "name": "小紅帽"}
5.3根據查詢條件修改 語法比較複雜,根據條件修補資料時需要
POST student/_update_by_query{ "query": { "bool": { "must": [ { "term": { "code": { "value": "2" } } } ] } }, "script": { "lang": "painless", "inline": "ctx._source.name= '小剛1'" }}
6.query資料
6.1指定id查詢資料 GET請求 /index/index_type/文件id
GET student/_doc/1
6.2查詢所有
GET /student/_search{ "query": { "match_all": {} }}
6.3分頁查詢 使用_search
GET /student/_search{ "from": 0, "size": 20}
6.4排序 按照年齡排序 asc和desc兩種排序規則
GET /student/_search{ "sort": [ { "age": { "order": "desc" } } ]}
6.5聚合按照年齡分組 aggs表示聚合,size=0必要設定,否則會返回資料,group_by_age是自定義分組名,terms表示分組,field對應分組欄位
GET /student/_search{ "size": 0, "aggs": { "group_by_age": { "terms": { "field": "age" } } }}
6.6按照code查詢,單值用term,多值用terms
GET student/_search{ "query": { "bool": { "must": [ { "term": { "code": { "value": "2" } } }, { "terms": { "code": [ "1", "2" ] } } ] } }}
7.delete資料
DELETE /student/_doc/1
POST /student/_delete_by_query{ "query": { "bool": { "must": [ { "term": { "age": { "value": 10 } } } ] } }}
最後是我在使用es時經常查閱的的參考資料:分享給大家
中文版api,雖然是es2.x版本的,仍具參考價值
https://www.elastic.co/guide/cn/elasticsearch/guide/cn/index.html
英文版api,大家可以根據自己的版本選擇
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/query-dsl.html