基本概念
可以對照數關系型據庫來理解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個部分:
- mappings定義field字段的名稱和類型。
- 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寫入時,有默認類型。在不同的應用場景,需顯示定義類型,具體類型如下圖所示:
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插件提供如下功能:
- 集群狀態:包括index占用空間/分片的狀態
- 顯示index中的數據
- 基本查詢
- 復合查詢(強烈不推薦使用)