ElasticSearch&kibana的安裝和使用

ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTfulweb接口。ElasticSearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。構建在全文檢索開源軟件Lucene之上的Elasticsearch,不只能對海量規模的數據完成分佈式索引與檢索,還能提供數據聚合分析。據國際權威的數據庫產品評測機構DBEngines的統計,在2016年1月,Elasticsearch已超過Solr等,成爲排名第一的搜索引擎類應用

歸納:基於Restful標準的高擴展高可用的實時數據分析的全文搜索工具java

ElasticSearch的基本概念

Indexmysql

相似於mysql數據庫中的databaselinux

Typegit

相似於mysql數據庫中的table表,es中能夠在Index中創建type(table),經過mapping進行映射。github

Documentweb

因爲es存儲的數據是文檔型的,一條數據對應一篇文檔即至關於mysql數據庫中的一行數據row,一個文檔中能夠有多個字段也就是mysql數據庫一行能夠有多列。
  
Field
  es中一個文檔中對應的多個列與mysql數據庫中每一列對應


sql

Mapping數據庫

能夠理解爲mysql或者solr中對應的schema,只不過有些時候es中的mapping增長了動態識別功能,感受很強大的樣子,其實實際生產環境上不建議使用,最好仍是開始制定好了對應的schema爲主。json

indexedvim

就是名義上的創建索引。mysql中通常會對常常使用的列增長相應的索引用於提升查詢速度,而在es中默認都是會加上索引的,除非你特殊制定不創建索引只是進行存儲用於展現,這個須要看你具體的需求和業務進行設定了。

Query DSL

相似於mysql的sql語句,只不過在es中是使用的json格式的查詢語句,專業術語就叫:QueryDSL

GET/PUT/POST/DELETE

分別相似與mysql中的select/update/delete…

win下安裝ElasticSearch

前提:已經安裝java-jdk環境(必須)
下載地址:https://www.elastic.co/cn/downloads/elasticsearch

解壓以後進入bin 啓動 elasticSearch 腳本

linux下安裝ElasticSearch

下載地址:https://www.elastic.co/cn/downloads/elasticsearch
解壓以後進入es根目錄/config 配置 network.host: 0.0.0.0

會報錯:
在這裏插入圖片描述

解決方式:
bin/elasticsearch -Des.insecure.allow.root=true

或者修改bin/elasticsearch,加上ES_JAVA_OPTS屬性:
ES_JAVA_OPTS="-Des.insecure.allow.root=true"

再次啓動:
在這裏插入圖片描述這是出於系統安全考慮設置的條件。因爲ElasticSearch能夠接收用戶輸入的腳本而且執行,爲了系統安全考 慮,建議建立一個單獨的用戶用來運行ElasticSearch。

建立用戶組和用戶:

groupadd esgroup

useradd esuser -g esgroup -p espassword

更改elasticsearch文件夾及內部文件的所屬用戶及組:

cd /opt

chown -R esuser:esgroup elasticsearch-6.2.4

切換用戶並運行:

su esuser

而後進入./bin下 使用./elasticSearch 腳本啓動服務,
後臺啓動:./elasticSearch -d


若是你是win的話直接整個win的本地玩一下就行,mac也同樣,不必搞個遠程hou麻煩的


安裝Kibana

Kibana是一個針對Elasticsearch的開源分析及可視化平臺,使用Kibana能夠查詢、查看並與存儲在ES索引的數據進行交互操做,使用Kibana能執行高級的數據分析,並能以圖表、表格和地圖的形式查看數據

(1)下載Kibana
https://www.elastic.co/downloads/kibana 注意:要和你的es版本一致

(2)把下載好的壓縮包拷貝到/soft目錄下

(3)解壓縮,並把解壓後的目錄移動到/user/local/kibana

(4)編輯kibana配置文件

[root@localhost /]# vim /usr/local/kibana/config/kibana.yml

將server.host,elasticsearch.url修改爲所在服務器的ip地址

(5)開啓5601端口

Kibana的默認端口是5601

開啓防火牆:systemctl start firewalld.service

開啓5601端口:firewall-cmd --permanent --zone=public --add-port=5601/tcp

重啓防火牆:firewall-cmd –reload

(6)啓動Kibana

[root@localhost /]# /usr/local/kibana/bin/kibana

瀏覽器訪問:http://ip:5601


在這裏寫dsl:
在這裏插入圖片描述
點這個執行:
在這裏插入圖片描述



安裝中文分詞器

(1)下載中文分詞器
https://github.com/medcl/elasticsearch-analysis-ik

下載elasticsearch-analysis-ik-master.zip

(2)解壓elasticsearch-analysis-ik-master.zip

unzip elasticsearch-analysis-ik-master.zip

(3)進入elasticsearch-analysis-ik-master,編譯源碼

mvn clean install -Dmaven.test.skip=true

(4)在es的plugins文件夾下建立目錄ik

(5)將編譯後生成的elasticsearch-analysis-ik-版本.zip移動到ik下,並解壓

(6)解壓後的內容移動到ik目錄下

基本DSL:

重複一遍:相似於mysql的sql語句,只不過在es中是使用的json格式的查詢語句,專業術語就叫:QueryDSL
GET/PUT/POST/DELETE
分別相似與mysql中的select/update/delete…


下面正式開始:

#建立索引
PUT /test
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  }, 
  "mappings": {
    "user":{
      "properties":{
        "name":{
          "type":"text"
        },
        "address":{
          "type":"text"
          
        },
        "age":{
          "type":"integer"
        },
        "interests":{
          "type":"text"
        },
        "birthday":{
          "type":"date"
        }
      }
    }
  }
}

#插入數據
PUT /test/user/1
{
        "name":"張三",
        "address":"朱雀大街",
        "age":2,
        "interests":"吃飯,睡覺,打豆豆",
        "birthday":"2001-09-08"
}

PUT /test/user/2
{
        "name":"李四",
        "address":"北京市",
        "age":16,
        "interests":"吃飯,踢球,打遊戲",
        "birthday":"2011-09-08"
}


PUT /test/user/3
{
        "name":"王五",
        "address":"南京市",
        "age":12,
        "interests":"敲代碼,捉迷藏,打遊戲",
        "birthday":"2021-09-08"
}


PUT /test/user/4
{
        "name":"趙六",
        "address":"山東省",
        "age":133,
        "interests":"敲代碼,學習,看電視",
        "birthday":"2031-09-08"
}


PUT /test/user/5
{
        "name":"張三丰",
        "address":"青島市",
        "age":99,
        "interests":"打太極,練內功,教徒弟",
        "birthday":"2099-09-08"
}




PUT /test/user/6
{
        "name":"李白",
        "address":"西安市",
        "age":32,
        "interests":"舞劍,寫詩,喝酒",
        "birthday":"1529-09-08"
}


PUT /test/user/7
{
        "name":"過濾空測試",
        "address":"",
        "age":0,
        "interests":"",
        "birthday":"9999-12-31"
}

# 刪除索引 易碎勿碰 DELETE test

#查詢全部
GET test/user/_search

#term:查詢某個字段裏含有某個關鍵詞的文檔
GET test/user/_search
{
  "query": {
    "term": {
      "name": "李"
    }
  }
}

# match查詢(重要)
#match query知道分詞器的存在,會對filed進行分詞操做,而後再查詢
GET test/user/_search
{
  "query": {
    "match": {
      "name": "趙"
    }
  }
}

#match_all:查詢全部文檔
GET test/user/_search
{
  "query": {
    "match_all": {}
  }
}

#multi_match:能夠指定多個字段
GET test/user/_search
{
  "query": {
    "multi_match": {
      "query": "打豆豆",
      "fields": ["name","interests"]
    }
  }
}

#match_phrase:短語匹配查詢ElasticSearch引擎首先分析(analyze)查詢字符串,
#從分析後的文本中構建短語查詢,這意味着必須匹配短語中的全部分詞,
#而且保證各個分詞的相對位置不變
GET test/user/_search
{
  "query": {
    "match_phrase": {
      "interests": "吃飯,睡覺"
    }
  }
}


# _source 返回指定字段
GET test/user/_search
{
  "_source": ["name","interests"],
  "query": {
    "multi_match": {
      "query": "李",
      "fields": ["name","interests"]
    }
  }
}

#排序 desc:降序,asc升序
GET test/user/_search
{
  
  "query": {
    "match": {
      "name":"李"
    }
  },
  "sort": [
    {
      "birthday": {
        "order": "asc"
      }
    }
  ]
    
}

#前綴匹配查詢
GET test/user/_search
{
  "query": {
    "match_phrase_prefix": {
      "name": "張"
    }
  }
}

# 範圍查詢 range:實現範圍查詢
# 默認包頭包尾 經過參數設置爲false表示關閉,默認true
GET test/user/_search
{
  "query": {
      "range": {
        "birthday": {
          "from": "2011-09-08",
          "to": "2021-09-08",
          "include_lower":true,
          "include_upper":true
        }
      }
  }
}

GET test/user/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

# fuzzy實現模糊查詢
GET test/user/_search
{
  "query": {
    "fuzzy": {
      "name": "趙"
    }
  }
}

#高亮搜索結果(重要)
GET test/user/_search
{
  "query": {
    "fuzzy": {
      "name": "趙"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}



#filter是不計算相關性的,同時能夠cache。所以,filter速度要快於query。(重要)

GET test/user/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "name": "李"
        }
      }
    }
  }
}

#   bool過濾查詢(重要)
#   能夠實現組合過濾查詢
#   格式:
# {
#     "bool": {
#         "must": [],
#         "should": [],
#         "must_not": []
#     }
# }
# must :必須知足的條件---and
# should:能夠知足也能夠不知足的條件--or
# must_not:不須要知足的條件--not
GET test/user/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"age":133}},
        {"term": {"birthday" : "2031-09-08"}}
      ],
      "must_not": [
        {"term": {"_id" : "1"}}
      ]
    }
  }
}

GET test/user/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {"_id" : "1"}},
        {"term": {"_id" : "2"}}
      ]
    }
  }
}

# 範圍過濾
# gt: >
# lt: <
# gte: >=
# lte: <=
GET test/user/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 90,
            "lte": 300
          }
        }
      }
    }
  }
}

# 過濾非空 exists
GET test/user/_search
{
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "address"
        }
      }
    }
  }
}

# 聚合查詢 aggs (重要)

#sum 求和 
#好比:求年齡的總和
GET test/user/_search
{
  "aggs": {
    "ages_sum": {
      "sum": {"field": "age"}
    }
  }
}
#ages_sum是自定義的返回結果的名稱

#返回結果:
# 上面是文檔的數據看底部的aggregations,
# "aggregations" : {
#      "ages_sum" : {
#        "value" : 294.0
#     }
#   }

#min最小值 年齡最小 size:長度
GET test/user/_search
{
  "size": 0, 
  "aggs": {
    "min_age": {
      "min": {
        "field": "age"
      }
    }
  }
}

#max 最大值
GET test/user/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  }
}

#avg 平均值
GET test/user/_search
{
  "size": 0, 
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age"
      }
    }
  }
}

#cardinality 求基數 
#什麼是基數? 互不相同的數的個數
GET test/user/_search
{
  "size": 0, 
  "aggs": {
    "card_ages": {
      "cardinality": {
        "field": "age"
      }
    }
  }
}
#返回結果:
# "aggregations" : {
#      "card_ages" : {
#        "value" : 7
#     }
#   }

# 分組 terms
GET test/user/_search
{
  "size": 0, 
  "aggs": {
    "group_ages": {
      "terms": {
        "field": "age"
      }
    }
  }
}
#返回結果:
#"aggregations" : {
#    "group_ages" : {
#      "doc_count_error_upper_bound" : 0,
#      "sum_other_doc_count" : 0,
#      "buckets" : [
#        {
#          "key" : 0,
#          "doc_count" : 1
#        },
#        {
#          "key" : 2,
#          "doc_count" : 1
#        },
#        {
#          "key" : 12,
#          "doc_count" : 1
#        },
#        {
#          "key" : 16,
#          "doc_count" : 1
#        },
#        {
#          "key" : 32,
#          "doc_count" : 1
#        },
#        {
#          "key" : 99,
#          "doc_count" : 1
#        },
#        {
#          "key" : 133,
#          "doc_count" : 1
#        }
#      ]
#    }
#  }

#來個好玩的:將行李的user按年齡分組
GET test/user/_search
{
  "size": 0, 
  "query": {
    "match": {
      "name": "李"
    }
  },
  "aggs": {
    "li_ages": {
      "terms": {
        "field": "age"
      }
    }
  }
}
# 結果:
#"aggregations" : {
#    "li_ages" : {
#      "doc_count_error_upper_bound" : 0,
#      "sum_other_doc_count" : 0,
#      "buckets" : [
#        {
#          "key" : 16,
#          "doc_count" : 1
#        },
#        {
#          "key" : 32,
#          "doc_count" : 1
#        }
#      ]
#    }
#  }

#再來個好玩的:求每組分的平均年齡,看我操做
GET test/user/_search
{
  "size": 0,
  "query": {
    "match": {
      "name": "李"
    }
  },
  "aggs": {
    "li_ages": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        "li_avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}
#結果:
#  "aggregations" : {
#    "li_ages" : {
#      "doc_count_error_upper_bound" : 0,
#      "sum_other_doc_count" : 0,
#      "buckets" : [
#        {
#          "key" : 16,
#          "doc_count" : 1,
#          "li_avg_age" : {
#            "value" : 16.0
#          }
#        },
#        {
#          "key" : 32,
#          "doc_count" : 1,
#          "li_avg_age" : {
#            "value" : 32.0
#          }
#        }
#      ]
#    }
#  }

#再再來個好玩的:求每組分的平均年齡,而後我要排個序
GET test/user/_search
{
  "size": 0,
  "query": {
    "match": {
      "name": "李"
    }
  },
  "aggs": {
    "li_ages": {
      "terms": {
        "field": "age",
        "order": {
          "li_avg_age": "desc"
        }
      },
      "aggs": {
        "li_avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}
#結果:
#"aggregations" : {
#    "li_ages" : {
#      "doc_count_error_upper_bound" : 0,
#      "sum_other_doc_count" : 0,
#      "buckets" : [
#        {
#          "key" : 32,
#          "doc_count" : 1,
#          "li_avg_age" : {
#            "value" : 32.0
#          }
#        },
#        {
#          "key" : 16,
#          "doc_count" : 1,
#          "li_avg_age" : {
#            "value" : 16.0
#          }
#        }
#      ]
#    }
#  }

java操做有空寫。 有用記得點在關注,感謝!

相關文章
相關標籤/搜索