Elasticsearch 入門

基本概念

索引

  • 索引(index)是Elasticsearch對邏輯數據的邏輯存儲,所以它可以分爲更小的部分。
  • 可以把索引看成關係型數據庫的表,索引的結構是爲快速有效的全文索引準備的,特別是它不存儲原始值。
  • Elasticsearch可以把索引存放在一臺機器或者分散在多臺服務器上,每個索引有一或多個分片(shard),每個
  • 分片可以有多個副本(replica)。

文檔

  • 存儲在Elasticsearch中的主要實體叫文檔(document)。用關係型數據庫來類比的話,一個文檔相當於數據庫表中的一行記錄。
  • Elasticsearch和MongoDB中的文檔類似,都可以有不同的結構,但Elasticsearch的文檔中,相同字段必須有相同類型。
  • 文檔由多個字段組成,每個字段可能多次出現在一個文檔裏,這樣的字段叫多值字段(multivalued)。
  • 每個字段的類型,可以是文本、數值、日期等。字段類型也可以是複雜類型,一個字段包含其他子文檔或者數組。

映射

  • 所有文檔寫進索引之前都會先進行分析,如何將輸入的文本分割爲詞條、哪些詞條又會被過濾,這種行爲叫做映射(mapping)。一般由用戶自己定義規則。

文檔類型

  • 在Elasticsearch中,一個索引對象可以存儲很多不同用途的對象。例如,一個博客應用程序可以保存文章和評論。
  • 每個文檔可以有不同的結構。
  • 不同的文檔類型不能爲相同的屬性設置不同的類型。例如,在同一索引中的所有文檔類型中,一個叫title的字段必須具有相同的類型。

 

RESTful API

在Elasticsearch中,提供了功能豐富的RESTful API的操作,包括基本的CRUD、創建索引、刪除索引等操作。

創建非結構化索引

在Lucene中,創建索引是需要定義字段名稱以及字段的類型的,在Elasticsearch中提供了非結構化的索引,就是不
需要創建索引結構,即可寫入數據到索引中,實際上在Elasticsearch底層會進行結構化操作,此操作對用戶是透明
的。
創建空索引:

PUT /haoke
{
 "settings": {
   "index": {
    "number_of_shards": "2", #分片數
    "number_of_replicas": "0" #副本數
  }
 }
}
#刪除索引
DELETE /haoke
{
 "acknowledged": true
}

 插入數據

URL規則:
POST /{索引}/{類型}/{id}

POST /haoke/user/1001
#數據
{
 "id":1001,
 "name":"張三",
 "age":20,
 "sex":"男"
}
#響應
{
  "_index": "haoke",
  "_type": "user",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
 },
  "_seq_no": 0,
  "_primary_term": 1
}

 說明:非結構化的索引,不需要事先創建,直接插入數據默認創建索引。

不指定id插入數據:

POST /haoke/user/
{
 "id":1002,
 "name":"張三",
 "age":20,
 "sex":"男"
}

 更新數據

在Elasticsearch中,文檔數據是不爲修改的,但是可以通過覆蓋的方式進行更新。

PUT /haoke/user/1001
{
 "id":1001,
 "name":"張三",
 "age":21,
 "sex":"女"
}

更新結果如下:

 

 

 可以看到數據已經被覆蓋了。
問題來了,可以局部更新嗎? -- 可以的。
前面不是說,文檔數據不能更新嗎? 其實是這樣的:
在內部,依然會查詢到這個文檔數據,然後進行覆蓋操作,步驟如下:
1. 從舊文檔中檢索JSON
2. 修改它
3. 刪除舊文檔
4. 索引新文檔
示例:

#注意:這裏多了_update標識
POST /haoke/user/1001/_update
{
"doc":{
 "age":23
}
}

 

 可以看到數據已經被局部更新了

 

刪除數據

在Elasticsearch中,刪除文檔數據,只需要發起DELETE請求即可。

DELETE /haoke/user/1001 

 需要注意的是,result表示已經刪除,version也更加了。
如果刪除一條不存在的數據,會響應404:

 說明:
刪除一個文檔也不會立即從磁盤上移除,它只是被標記成已刪除。Elasticsearch將會在你之後添加更多索引的
時候纔會在後臺進行刪除內容的清理。

 

搜索數據

根據id搜索數據

GET /haoke/user/BbPe_WcB9cFOnF3uebvr
#返回的數據如下
{
  "_index": "haoke",
  "_type": "user",
  "_id": "BbPe_WcB9cFOnF3uebvr",
  "_version": 8,
  "found": true,
  "_source": {  #原始數據在這裏
    "id": 1002,
    "name": "李四",
    "age": 40,
    "sex": "男"
 }
}

搜索全部數據

GET /haoke/user/_search 

響應:(默認返回10條數據)

{
  "took": 26,
  "timed_out": false,
  "_shards": {
    "total": 2,
    "successful": 2,
    "skipped": 0,
    "failed": 0
 },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
     {
        "_index": "haoke",
        "_type": "user",
        "_id": "BbPe_WcB9cFOnF3uebvr",
        "_score": 1,
        "_source": {
          "id": 1002,
          "name": "李四",
          "age": 40,
          "sex": "男"
       }
     },
     {
        "_index": "haoke",
        "_type": "user",
        "_id": "1001",
        "_score": 1,
        "_source": {
          "id": 1001,
          "name": "張三",
          "age": 20,
          "sex": "男"
       }
     },
     {
        "_index": "haoke",
        "_type": "user",
 "_id": "1003",
        "_score": 1,
        "_source": {
          "id": 1003,
          "name": "王五",
          "age": 30,
          "sex": "男"
       }
     },
     {
        "_index": "haoke",
        "_type": "user",
        "_id": "1004",
        "_score": 1,
        "_source": {
          "id": 1004,
          "name": "趙六",
          "age": 30,
          "sex": "男"
       }
     }
   ]
 }
}

關鍵字搜素數據

#查詢年齡等於20的用戶
GET /haoke/user/_search?q=age:20

結果:

 DSL搜索

Elasticsearch提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL),它允許你構建更加複雜、強大的查詢。
DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現。

POST /haoke/user/_search
#請求體
{
  "query" : {
    "match" : {  #match只是查詢的一種
      "age" : 20
   }
 }
}

響應數據:

 實現:查詢年齡大於30歲的男性用戶。

現有數據:

 

POST /haoke/user/_search
#請求數據
{
  "query": {
    "bool": {
      "filter": {
"range": {
          "age": {
            "gt": 30
         }
       }
     },
      "must": {
        "match": {
          "sex": "男"
       }
     }
   }
 }
}

查詢結果:

                                                                                                                                                                                                                                                                                          

 全文搜索

POST /haoke/user/_search
#請求數據
{
  "query": {
    "match": {
      "name": "張三 李四"
   }
 }
}

 高亮顯示

POST /haoke/user/_search
{
  "query": {
    "match": {
      "name": "張三 李四"
              }
           },
  "highlight": {
    "fields": {
      "name": {}
   }
 }
}

 聚合

在Elasticsearch中,支持聚合操作,類似SQL中的group by操作。

 

POST /haoke/user/_search
{
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "age"
     }
   }
 }
}

結果:

 從結果可以看出,年齡30的有2條數據,20的有一條,40的一條。

 

 

參考文檔:

https://www.bilibili.com/video/av67957955/?p=56&t=49

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章