一、簡介
- Elasticsearch和MongoDB/Redis類似,是非關(guān)系型數(shù)據(jù)庫,從索引文檔到文檔能被搜索到只有一個輕微的延遲,是采用Restful API標(biāo)準(zhǔn)的可擴展和高可用的實時數(shù)據(jù)分析的全文搜索工具
-
Elastic Search的實現(xiàn)原理是,利用內(nèi)置分詞器(Analyzer)對數(shù)據(jù)庫文本進行分詞,將解析出的關(guān)鍵詞和數(shù)據(jù)庫文檔建立倒排索引。輸入的搜索文本也會進行分詞,通過倒排索引找到匹配的數(shù)據(jù)庫文本。之后使用 TF-IDF算法,根據(jù)相關(guān)度對每個匹配的文本進行評分排序,返回搜索結(jié)果。
二、ES數(shù)據(jù)庫特性
- 可拓展:支持一主多從且擴容簡易,只要cluster.name一致且在同一個網(wǎng)絡(luò)中就能自動加入當(dāng)前集群;本身就是開源軟件,也支持很多開源的第三方插件
- 高可用:在一個集群(Cluster)多個節(jié)點(Node)中分布式存儲,索引(Index)支持分片(Shards)和復(fù)制(Replicas),即使部分節(jié)點down掉,也能自動進行數(shù)據(jù)恢復(fù)和主從切換
-
采用RestfulAPI標(biāo)準(zhǔn):通過http接口使用JSON格式進行操作數(shù)據(jù);數(shù)據(jù)存儲的最小單位是文檔,本質(zhì)上是一個JSON 文本
三、與關(guān)系型數(shù)據(jù)庫的區(qū)別
- 索引 Index:一個擁有幾分相似特征的文檔的集合
- 類型 Type:索引可以為擁有相同字段的文檔定義一個類型;個索引中可以創(chuàng)建多個Type
- 文檔 Document:一個文檔是一個可被索引的基礎(chǔ)信息單元
- 字段 Field:Elasticsearch的最小單位,相當(dāng)于數(shù)據(jù)某一列
- 映射 Mapping:所有的文檔在寫進索引之前都需要進行分析,如何將輸入的文本分隔為詞條,哪些詞條又會被過濾,這種行為叫做映射,一般由用戶自己定義相應(yīng)的規(guī)則
SQL數(shù)據(jù)庫(MySQL) | NoSQL數(shù)據(jù)庫(ES) |
---|---|
數(shù)據(jù)庫 Database | 索引 Index |
表 Table | 類型 Type |
數(shù)據(jù)行 Row | 文檔 Document |
數(shù)據(jù)列 Column | 字段 Field |
四、ELK搭建
ELK = elasticsearch + logstash + kibana
ELK常作為大型分布式系統(tǒng)的日志分析收集處理的解決方案:
- ElasticSearch是一個基于Lucene基礎(chǔ)上構(gòu)建的開源搜索工具,具備實時性、分布式、可擴展等優(yōu)點,并對Lucene進行了封裝,開發(fā)者通過RESTful API即可實現(xiàn)對數(shù)據(jù)的搜索;
- logstash是一個用于日志搜集, 分析, 過濾的工具. client端一般部署在用于搜集日志的主機上, server端負(fù)責(zé)將接收的到日志進行過濾, 然后轉(zhuǎn)發(fā)到elasticsearch上;
- kibana是一個用于匯總分析和搜索日志的工具, 可以為elasticsearch和logstash提供友好的日志分析的web界面;
在docker上搭建ELK,完成非關(guān)系型數(shù)據(jù)庫的構(gòu)建
- docker安裝教程:Install Docker Engine on CentOS
- ELK搭建教程:基于騰訊云服務(wù)器安裝ELK
常見問題
1. 生成注冊令牌
連接 Kibana 實例或在安全的 Elasticsearch 集群中注冊其他節(jié)點。
使用 elasticsearch-create-enrollment-token 工具創(chuàng)建注冊令牌。
2. 頁面數(shù)據(jù)查詢報406錯誤
ES-Head需要Restful接口
{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
解決方法:
- 進入docker容器
# 命令 docker exec -it 容器ID /bin/bash
[root@localhost ~]# docker exec -it es-head /bin/bash
- cd進入_site/目錄,編輯vendor.js
[root@localhost ~]# vim _site/vendor.js
# 6886行: contentType: “application/x-www-form-urlencoded改成
# contentType: "application/json;charset=UTF-8"
# 7573行: var inspectData = s.contentType === “application/x-www-form-urlencoded” && 改成
# var inspectData = s.contentType === "application/json;charset=UTF-8" &&
3. kibana Unable to connect to Elasticsearch at http://elasticsearch:9200
重啟elk服務(wù)后,需要在kibana修改es的ip
解決方法:
- 進入docker容器
# 命令 docker exec -it 容器ID /bin/bash
[root@localhost ~]# docker exec -it es-head /bin/bash
- kibana的配置文件出了問題,所以要修改配置文件,找到kibana.yml,進入修改
vim /etc/kibana/kibana.yml
# 將elasticsearch改為自己的ip
- 重啟kibana
五、ES基本操作
1. ES數(shù)據(jù)庫建立
- 把所有字段設(shè)置為
"index": "not_analyzed"
- _source 打開,不用零散存儲每個字段,更高效
- _all 關(guān)閉,因為檢索是基于 k=v 這樣字段已知的查詢的
{
"properties":{
"屬性": {
"index": "not_analyzed",
"type": "類型"
}
}
"_source": {
"enabled": true
},
"_all": {
"enabled": false
}
}
2. ES索引相關(guān)操作
添加索引
- 請求形式
PUT
- Content-Type:
application/json
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}
{
"settings":{
"index":{
"number_of_shards":"2", // 分片
"number_of_replicas":"0", // 副本數(shù)
}
}
}
刪除索引
- 請求形式
DELETE
- Content-Type:
application/json
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}
3. ES文檔相關(guān)操作
添加文檔
- 請求形式
POST
- Content-Type:
application/json
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}
/* id不是必填項,如果不傳,ES會給一個默認(rèn)值 */
{
// 創(chuàng)建的文檔數(shù)據(jù)內(nèi)容
"屬性1": "值1",
"屬性2": "值2",
"屬性3": "值3 ",
"屬性4": "值4"
......
}
更新文檔(局部更新)
- 請求形式
POST
- Content-Type:
application/json
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}/_update
/* id是必填項 */
{
// 更新的局部數(shù)據(jù)內(nèi)容
// doc作為鍵的數(shù)據(jù)json串
"doc": {
"屬性1": "值1",
"屬性2": "值2"
.....
}
}
刪除文檔
- 請求形式
DELETE
- Content-Type:
application/json
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}
/* id是必填項 */
查詢文檔
/* 簡易查詢 */
請求形式 GET
Content-Type: application/json
/* 通過id查詢,返回文檔全部字段 */
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}
/* 通過id查詢,只返回文檔特定字段 */
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}/_source?source=字段1,字段2
/* 全量查找,返回類型全部數(shù)據(jù) */
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 簡易條件查詢,返回類型中符合條件的文檔 */
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search?q=條件{字段: 值}
/* DSL搜索 */
請求形式 POST
Content-Type: application/json
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢年齡為34的用戶數(shù)據(jù) */
JSON
{
"query": {
"match": {
"age": 34
}
}
}
/* 例如:查詢年齡大于26歲且性別為男的用戶數(shù)據(jù) */
JSON
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gt": 26
}
}
},
"must": {
"match": {
"sex": "男"
}
}
}
}
}
/* 例如:查詢名字為魏大勇和秀琴的用戶信息 */
JSON
{
"query": {
"match": {
"name": "魏大勇 秀琴"
}
}
}
/* 查詢結(jié)果高亮顯示 */
/* 例如:查詢名稱為張三的用戶數(shù)據(jù) */
{
"query": {
"match": {
"name": "張三"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
/* 聚合操作(類似分組操作)*/
/* 例如:查詢各個年齡的用戶數(shù) */
{
"aggs": {
"all_interests": {
"terms": {
"field": "age.keyword"
}
}
}
}
4. 元數(shù)據(jù)操作
文檔 (document) 的元數(shù)據(jù)(Metedata)
- _index
- document 存儲在哪個 index 中
- 類似的文檔(document)放在同一個 index ,不同類型的文檔放在不同的 index
- index 名稱必須小寫,不用下劃線(_)開頭,不含逗號
- _type
- 代表 document 屬于 index 下的哪個類型(type)
- 一個 index 通常包含多個 type
- type 名稱可大小寫,不用下劃線(_)開頭,不含逗號
- _id
- 代表 document 唯一標(biāo)識,與index和type一起確定一個唯一的document
- id 生成方式
- 手動指定:
PUT /index/type/id
- 自動生成:
PUT /index/type/
(base64編碼20長度字符串,分布式集群下不可能重復(fù))
- 手動指定:
- _score
- 相關(guān)度分?jǐn)?shù):匹配程度,分?jǐn)?shù)越高越相關(guān)
查詢響應(yīng)
返回結(jié)果做JSON格式化操作
- 請求形式
GET POST
- 參數(shù):
?pretty
// url結(jié)尾加上參數(shù) - URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}?pretty
判斷某個文檔是否存在,不查詢它的內(nèi)容
- 請求形式
HEAD
- URL:
http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/{id}
- 返回: 200 OK; 404 Not Found
批量查詢
/* 例如:查詢id為1002和1003的文檔數(shù)據(jù) */
請求形式 POST
參數(shù):_mget // url結(jié)尾加上參數(shù)
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_mget
JSON
{
"ids":["1002","1003"]
}
批量添加
請求形式 POST
參數(shù):_bulk // url結(jié)尾加上參數(shù)
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_bulk
JSON // 注意:每條數(shù)據(jù)后需要加換行,最后一行也要加
{action:{metedata}}\n
{source body}\n
{action:{metedata}}\n
{source body}\n
......
/* 例如:新增三條數(shù)據(jù) */
{"create":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_1}"}}
{"id":"1006","name":"user001","age":20,"sex":"男"}
{"create":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_2}"}}
{"id":"1007","name":"user002","age":30,"sex":"男"}
{"create":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_3}"}}
{"id":"1008","name":"user003","age":40,"sex":"女"}
/* 例如:批量刪除三條數(shù)據(jù) */
{"delete":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_1}"}}
{"delete":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_2}"}}
{"delete":{"_index":"{索引名稱}","_type":"{類型}","_id":"{id_3}"}}
5. 分頁操作
ES搜索默認(rèn)最多返回10條數(shù)據(jù),需要分頁返回
請求形式 POST
參數(shù): ?size=n1&from=n2
size: 每頁顯示的結(jié)果數(shù)量
from: 跳過多少結(jié)果數(shù)
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search?size=3&from=0
/* 每頁顯示四條數(shù)據(jù),顯示第二頁 */
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search?size=4&from=4
6. 映射操作
如果沒有指定字段類型,ES會默認(rèn)給字段賦上相應(yīng)類型文章來源:http://www.zghlxwxcb.cn/news/detail-764060.html
ES支持的基本數(shù)據(jù)類型:文章來源地址http://www.zghlxwxcb.cn/news/detail-764060.html
- 字符串:
- text:存儲數(shù)據(jù)時,會自動分詞,并生成索引
- keyword:存儲數(shù)據(jù)時,不會分詞,直接整個詞去建索引
- 整數(shù) : byte, short, integer, long
- 浮點數(shù) : float、double
- 布爾型 : boolean
- 日期 : date
/* 創(chuàng)建索引的映射信息 */
請求形式 PUT
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}
JSON
{
"settings": {
"index": {
"number_of_shards": 2,
"number_of_replicas": 0
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"email": {
"type": "keyword"
},
"hobby": {
"type": "text"
}
}
}
}
/* 查詢索引的映射信息 */
請求形式 GET
參數(shù): _mapping
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/_mapping
7. 結(jié)構(gòu)化查詢
/* term查詢 - 用于精確匹配某些值 */
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢年齡為26的數(shù)據(jù)信息 */
JSON
{
"query": {
"term": {
"age": 26
}
}
}
/* terms查詢 - 和term類似,但terms允許指定多個匹配條件 */
/* 某個字段指定了多個值,那么文檔需要一起去匹配 */
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢年齡為26和30的用戶數(shù)據(jù)信息 */
JSON
{
"query": {
"term": {
"age": [26, 30]
}
}
}
/* range查詢 - 允許按照指定的范圍查找數(shù)據(jù) */
請求形式 POST
范圍操作符:
gt:大于
gte:大于等于
lt:小于
lte:小于等于
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢年齡大于等于26小于30的用戶數(shù)據(jù)信息 */
JSON
{
"query": {
"term": {
"age": {
"gte": 26,
"lt": 30
}
}
}
}
/* exists查詢 - 用于查找文檔中是否包含指定字段/沒有某個字段,類似SQL的is null */
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢包含title字段的數(shù)據(jù) */
JSON
{
"query": {
"exists": {
"field":"title"
}
}
}
/* match查詢 - 全文本查詢(模糊)以及精確查詢都可以用 */
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢名字中帶“云”字的數(shù)據(jù)信息 */
JSON
{
"query": {
"match": {
"name": "云"
}
}
}
/* bool查詢 - 合并多個條件的查詢結(jié)果的布爾邏輯 */
請求形式 POST
操作符:
must:多個查詢條件完全匹配,AND
must_not:多個查詢條件的相反匹配,NOT
should:至少有一個查詢條件匹配,OR
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢用戶性別為男的且年齡不大于30歲的數(shù)據(jù) */
JSON
{
"query": {
"bool": {
"must": {
"match": {
"sex": "男"
}
},
"must_not": {
"range": {
"age": {
"gt": 30
}
}
}
}
}
}
/* filter查詢 - 其他查詢都需要計算查詢結(jié)果的匹配程度,即元數(shù)據(jù)_source */
/* 過濾查詢不考慮_source,且可以緩存查詢結(jié)果,提升速度 */
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/{類型}/_search
/* 例如:查詢年齡為26歲的用戶數(shù)據(jù) */
JSON
{
"query": {
"bool": {
"filter": {
"term": {
"age": 26
}
}
}
}
}
8. IK Analyse
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/_analyze
/* 英文分詞 */
JSON
{
"analyzer": "standard", // 默認(rèn)英文分詞器
"text": "hello world" // 分詞文本
}
/* 中文分詞 */
JSON
{
"analyzer": "ik_max_word", //ik中文分詞器名稱為ik_max_word
"text": "你好,中國" // 分詞文本
}
9. 全文檢索
請求形式 POST
URL: http://{ELK服務(wù)地址}:9200/{索引名稱}/_search
/* 單詞查詢 */
JSON
{
// hobby這個field匹配 籃球 這個單詞
"query": {
"match": {
"hobby": "籃球"
}
},
// 結(jié)果高亮
"highlight": {
"fields": {
"hobby": {}
}
}
}
/* 多詞查詢 - 匹配多個單詞 */
JSON
{
// hobby這個field匹配 籃球 足球 這兩個單詞
"query": {
"match": {
"hobby": "籃球 足球"
}
},
// 結(jié)果高亮
"highlight": {
"fields": {
"hobby": {}
}
}
}
/* 多詞查詢 - 同時匹配多個單詞 */
JSON
{
// hobby這個field同時匹配 籃球和足球 這兩個單詞
"query": {
"match": {
"hobby": {
"query": "籃球 足球",
"operator":"and" // AND OR兩種情況
}
}
},
// 結(jié)果高亮
"highlight": {
"fields": {
"hobby": {}
}
}
}
/* 多詞查詢 - 設(shè)置匹配度40%進行查詢 */
JSON
{
// hobby這個field同時匹配 籃球和足球 這兩個單詞
"query": {
"match": {
"hobby": {
"query": "籃球 足球",
"minimum_should_match":"40%" // 設(shè)置匹配度,_source分?jǐn)?shù)越高匹配度越大
}
}
},
// 結(jié)果高亮
"highlight": {
"fields": {
"hobby": {}
}
}
}
到了這里,關(guān)于【ES數(shù)據(jù)庫】Elasticsearch安裝使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!