Elasticsearch基礎入門

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

https://www.elastic.co/guide/en/elasticsearch/reference/6.0/search-aggregations-metrics-avg-aggregation.html數據庫

 

 

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,那麼分片23就只會有一個區備份。

它的寫操做是須要副本數過半成功才成功的。

 

 

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_wordik_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操做見文檔

 https://www.elastic.co/guide/en/elasticsearch/reference/6.0/search-aggregations-metrics-avg-aggregation.html

相關文章
相關標籤/搜索