Elasticsearch是什麼?html
ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索,基於RESTful web接口。也就說它就是一個索引庫,用來存儲上面分詞以後建立的索引的,對外提供檢索服服務,http協議。對內就是一個nosql數據庫。git
資料:github
基於es2.x版本的,核心的東西仍是能夠看看,中文的:web
https://www.elastic.co/guide/cn/elasticsearch/guide/cn/index.htmlredis
Es6.x API:sql
ES分佈式索引介紹服務器
number_of_shards:分片數量,相似於數據庫裏面分庫分表,一經定義不可更改。爲何不能修改呢,它不像redis的集羣,添加或者減小主從時,集羣會從新分配slots。因此若是修改分片數量,會致使取模以後可能找不數據了,好比原來3個,4%3=1,如今變成4個分片4%4=0了。app
number_of_replicas:副本數,用於備份分片的,小於分片數。和主分片裏面的數據保持一致,主要響應讀操做,副本越多讀取就越快。副本會在另外的分片上面去存放。好比分片數量3,副本數2,數據1 hash以後落在分片1,那麼會在分片2和分片3上面去放副本。nosql
若是副本數設置1,那麼分片2和3就只會有一個區備份。
它的寫操做是須要副本數過半成功才成功的。
Es基礎語法:
首先咱們先安裝一箇中文分詞的插件。安裝和本身es對應版本的:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
安裝好了須要重啓纔會生效
Es的基礎操做(kibana中)
打開kibana—>dev tools,控制檯能夠執行操做
Management—>Index Management 能夠看到咱們建立好的索引
索引建立及設值
1.建立索引:
個人是單機,因此分片設置的1,備份0
PUT /test { "settings":{ "number_of_shards": 1, "number_of_replicas": 0 } }
2.建立索引,指定id創建索引
PUT /test/_doc/1 { "name": "張三", "age": 30 }
3.不設置id會默認生成一個,指定ID是PUT
POST /test/_doc { "name": "張三默認", "age": 30 }
4.全量修改值。Id爲1的數據全覆蓋
PUT /test/_doc/1 { "name": "張三1", }
5.部分修改,只會修改對應的字段
POST /test/_doc/1/_update { "doc":{ "name":"張三00" } }
6.指定_create防止重複建立,若是已經存在則失敗,第二次會報錯
POST /test/_doc/2/_create { "name":"李四", "age":20 }
刪除:
指定ID刪除文檔
DELETE /test/_doc/1
{
}
刪除索引
DELETE /test
{
}
查看分詞結果,默認使用的stander分詞器是每一個詞都分開
GET /test/_analyze { "field": "name", "text": "成都市天府廣場" }
結構化索引建立:能夠指定一些約束,好比分詞器,字段類型之類的
stander: 每一個詞都分開
english: 英文分詞器,會按照英文的語法來處理一些詞好比eating,eated 都會被處理成eat
ik_max_word: 中文分詞器,最大拆分,能分出來的詞都分出來
「武漢市長江大橋」->武漢,武漢市,市長,長江,大橋,長江大橋,江大橋
ik_smart: 中文分詞器,儘量分詞長的
「武漢市長江大橋」->武漢市,長江大橋
ik_max_word和ik_smart 須要裝中文分詞器插件
name字段分詞使用ik_max_word,查詢時使用ik_smart
enname 分詞查詢都是用english
PUT /test2 { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "_doc":{ "properties": { "name":{"type":"text","analyzer":"ik_max_word","search_analyzer": "ik_smart"}, "sname":{"type": "text","analyzer":"ik_smart"}, "enname":{"type":"text","analyzer":"english"}, "age":{"type": "integer"} } } } }
如今咱們看test2的sname字段的分詞結果:sname使用的中文分詞ik_smart
GET /test2/_analyze { "field": "sname", "text": "成都市天府廣場" }
咱們再看下對於test2的name字段使用的是ik_max_word
GET /test2/_analyze { "field": "name", "text": "成都市天府廣場" }
能夠看到對於一樣的文本,使用不一樣的分詞方式,出來的結果是不同。
查詢:
1.根據id查詢
GET /testtest/_doc/1
{
}
2.查詢索引全部,query加不加均可以
GET /test/_search { "query":{ "match_all": {} } }
3.按條件查詢,並分頁,注意分頁不能太多,由於es的分頁都是在內存中作的,太多了會撐爆內存
GET /test/_search { "query": { "match": { "name": "張三" } }, "from": 0, "size": 20 }
能夠看下淘寶的搜索也是限制了的一頁40個,最多100頁
4.排序
GET /test/_search { "query": { "match": { "name": "張三" } }, "sort": [ { "age": { "order": "desc" } } ], "from": 0, "size": 20 }
更多API操做見文檔: