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操做有空寫。 有用記得點在關注,感謝!