es實戰一:基本概念


基本概念

可以對照數關系型據庫來理解Elasticsearch的有關概念。

Relational DB Elasticsearch
Databases Indices
Tables Types
Rows Documents
Columns Fields

在ES中,存儲結構主要有四種,與傳統的關系型數據庫對比如下:

  • index(Indices)相當於一個database
  • type相當於一個table
  • document相當於一個row
  • properties(Fields)相當於一個column

關於type

6.*版本中type已過時,並且當前版本只能建一個type

7.*版本將刪除type,所以在開發過程中弱化type的概念

索引的CRUD

創建索引

索引創建包括2個部分:

  1. mappings定義field字段的名稱和類型。
  2. settings定義索引的分片和副本數量。

Mappings

https://www.elastic.co/guide/cn/elasticsearch/guide/current/mapping-intro.html

沒有設置mapping, 則默認為文本,對其進行分詞,

Mapping,就是對索引庫中索引的字段名稱及其數據類型進行定義,類似於mysql中的表結構信息。不過es的mapping比數據庫靈活很多,它可以動態識別字段。一般不需要指定mapping都可以,因為es會自動根據數據格式識別它的類型,如果你需要對某些字段添加特殊屬性(如:定義使用其它分詞器、是否分詞、是否存儲等),就必須手動添加mapping。

mappings映射示例如下:

{
  "mappings": {
    "radware": {
      "properties": {
        "sourceIp": {
          "type": "ip"
        },
        "destinationIp": {
          "type": "ip"
        },
        "natIp": {
          "type": "ip"
        },
        "deviceIp": {
          "type": "ip"
        },
        "interfaceIp": {
          "type": "ip"
        },
        "receiveTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "startTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "endTime": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "sourcePort": {
          "type": "keyword"
        },
        "destinationPort": {
          "type": "keyword"
        }
      }
    }
  }
}

自動檢測及動態映射Dynamic Mapping

動態映射編輯

當 Elasticsearch 遇到文檔中以前 未遇到的字段,它用 dynamic mapping 來確定字段的數據類型並自動把新的字段添加到類型映射。

有時這是想要的行為有時又不希望這樣。通常沒有人知道以后會有什么新字段加到文檔,但是又希望這些字段被自動的索引。也許你只想忽略它們。如果Elasticsearch是作為重要的數據存儲,可能就會期望遇到新字段就會拋出異常,這樣能及時發現問題。

幸運的是可以用 dynamic 配置來控制這種行為 ,可接受的選項如下:

true

動態添加新的字段--缺省

false

忽略新的字段

strict

如果遇到新字段拋出異常

此外還可以自定義動態映射,定義動態模板

Settings

settings是修改分片和副本數的。

settings修改索引庫默認配置

  例如:分片數量,副本數量

  查看:curl -XGET http://192.168.80.10:9200/zhouls/_settings?pretty

  操作不存在索引:

curl -XPUT '192.168.80.10:9200/liuch/' -d
'{"settings":{"number_of_shards":3,"number_of_replicas":0}}'

  操作已存在索引:

curl -XPUT '192.168.80.10:9200/zhouls/_settings' -d
'{"index":{"number_of_replicas":1}}'

總結:就是,不存在索引時,可以指定副本和分片,如果已經存在,則只能修改副本。

  在創建新的索引庫時,可以指定索引分片的副本數。默認是1,這個很簡單

關於分片和副本,后續將展開講。es默認分片為5,副本為1。分片如果插入數據后,分片不能修改,副本數量可以修改。

關於Fields, 插入數據后,原有Fields不能修改,但可以新增Fields。

插入數據

curl -XPOST 'localhost:9200/customer/external?pretty' -d' {"name": "Jane Doe" }'

刪除索引

DELETE xz-logs-10

更新索引

ES同樣支持更新,但是更新的方式是通過一個提供的腳本進行的。ES的做法是,通過index找到相應的存放記錄的節點,然后執行腳本,執行完之后,返回新的索引。實際上執行的是一個get和reindex的過程

get,reindex的含義是,ES先取出這條記錄,然后根據新數據生成新記錄,然后在把新記錄放回到ES中(並不會覆蓋老的記錄)。

Documents in Elasticsearch are immutable; we cannot change them. Instead, if we need to update an existing document, we reindex or replace it.

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "I am starting to get the hang of this...",
  "date":  "2014/01/02"
}


{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 2,
  "created":   false 
}
  • 對於海量增長的數據,數據只要求保存有限的時間,es推薦按日期建索引,如果某段時間數據不需要保存,則刪除對應時間的索引。以前的timestamp+ttl的方式已經不推薦了。

查詢索引

GET /megacorp/employee/1

GET /megacorp/employee/_search?q=last_name:Smith

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

多索引查詢

/_search
在所有的索引中搜索所有的類型

/gb/_search
在 gb 索引中搜索所有的類型

/gb,us/_search
在 gb 和 us 索引中搜索所有的文檔

/g,u/_search
在任何以 g 或者 u 開頭的索引中搜索所有的類型

/gb/user/_search
在 gb 索引中搜索 user 類型

/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 類型

/_all/user,tweet/_search
在所有的索引中搜索 user 和 tweet 類型

Filed類型

往es寫入時,有默認類型。在不同的應用場景,需顯示定義類型,具體類型如下圖所示:
iamge

Text vs. keyword

ElasticSearch數據類型--string類型已死, 字符串數據永生

ElasticSearch對字符串擁有兩種完全不同的搜索方式. 你可以按照整個文本進行匹配, 即關鍵詞搜索(keyword search), 也可以按單個字符匹配, 即全文搜索(full-text search). 對ElasticSearch稍有了解的人都知道, 前者的字符串被稱為not-analyzed字符, 而后者被稱作analyzed字符串.

text用於全文搜索的, 而keyword用於關鍵詞搜索.

如果想做類似於sql中的like查詢,可定義為keyword並使用通配符wildcard方式查詢。

字符串將默認被同時映射成text和keyword類型

{
    "foo": {
        "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }
}

基於這個映射你即可以在foo字段上進行全文搜索, 也可以通過foo.keyword字段實現關鍵詞搜索及數據聚合.

禁用這個特性也很方便: 你只需要在定義mapping時顯式聲明字符串字段的類型或者使用一個動態模板(dynamic template)來匹配你所有的字符串字段即可. 例如通過下面的dynamic template就可以恢復到在ElasticSearch 2.x中使用的dynamic template的效果:

{
"match_mapping_type": "string",
"mapping": {
"type": "text"
}
}

date

將字段定義為date類型,可自定義時間格式,此字段可按時間范圍進行查詢。

插件使用

kibana console

kibana的console,是驗證restapi唯一選擇。不推薦使用head插件的復合查詢,因為其查詢有誤,但是head插件的其他功能還是可以使用。

elasticsearch-head

head插件提供如下功能:

  1. 集群狀態:包括index占用空間/分片的狀態
  2. 顯示index中的數據
  3. 基本查詢
  4. 復合查詢(強烈不推薦使用)

參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM