ElasticSearch簡單demo學習
阿新 • • 發佈:2018-11-09
1、單例安裝和head外掛安裝
1)、從Elasticsearch官網下載zip檔案,解壓即可 2)、啟動Elasticsearch,找到安裝目錄中的bin\elasticsearch.bat,雙擊執行,在瀏覽器訪問localhost:9200,顯示elasticsearch基礎資訊,即啟動成功 3)、head外掛的下載:https://github.com/mobz/elasticsearch-head(注意,head外掛的使用要求安裝了node.js換件) 4)、下載head外掛解壓,cd到head目錄中,執行npm install安裝外掛 5)、因為Elasticsearch是兩個不同的域,要進行配置才能在head外掛中實現跨域訪問Elasticsearch。在Elasticsearch的目錄config/elasticsearch.yml,在檔案最後面加上 http.cors.enabled: true http.cors.allow-origin: "*" 6)、啟動head外掛,npm run start,在瀏覽器訪問localhost:9300,即可看到head外掛連上Elasticsearch
2、Elasticsearch分散式安裝
1)、需求:建立一個Elasticsearch叢集,裡面有三個節點,master節點為主節點,slave1和slave2是兩個子節點 2)、配置一個master節點:開啟config/elasticsearch.yml檔案,配置: cluster.name: duanss --表示叢集的名字是duanss node.name: master --表示這個節點的名字 master node.master: true --指定這個節點為主節點master network.host: 127.0.0.1 --繫結一個ip,埠預設9200 3)、複製兩個新解壓的Elasticsearch的資料夾,取名slave1、slave2 修改slave1的config/elasticsearch.yml: cluster.name: duanss --這個要與主節點一致,表名是在同一叢集下 node.name: slave1 --節點名字 network.host: 127.0.0.1 --繫結一個ip http.port: 8200 --指定埠8200,因為預設是9200,與master衝突 discovery.zen.ping.unicast.hosts: ["127.0.0.1"] --給這個節點指定主節點的ip 修改slave2的config/elasticsearch.yml: cluster.name: duanss --這個要與主節點一致,表名是在同一叢集下 node.name: slave2 --節點名字 network.host: 127.0.0.1 --繫結一個ip http.port: 7200 --指定埠7200,因為預設是9200,與master衝突 discovery.zen.ping.unicast.hosts: ["127.0.0.1"] --給這個節點指定主節點的ip
3、Elasticsearch基礎概念
1)、索引:含有相同屬性的文件集合(例如:可以用一個索引來代表消費者的資料,另一個索引代表產品的資料)
2)、型別:一個索引裡面可以定義一個或多個型別,但是文件必須屬於一個型別,通常會定義相同欄位的文件作為一個型別
3)、文件:文件是可以被索引的基本資料單位(例如:一個使用者的基本資訊)
總結:索引相當於一個數據庫,型別相當於一個table,文件相當於table中的一行記錄
4)、分片:每個索引都有多個分片,每個分片都是一個Lucene索引
5)、備份:拷貝一份分片,就完成了分片的備份
4、Elasticsearch基本使用
1)、索引建立:使用head外掛,直接建立索引,建立是可以指定分片數和備份數,預設是5個分片,一個備份(是每個分片一個備份),這兩個資料只能在建立索引時指定,後續不能再修改 檢視索引的基本資訊,mappings的值為空,表示是非結構化建立,反之即為結構化建立 Elasticsearch 有自己的RESTFul API,基本格式:http://<ip>:<port>/<索引>/<型別>/<文件id> 例如: 可以使用http的PUT方式,訪問http://localhost:9200/people body為json資料: { "settings": { "number_of_shards": "3", "number_of_replicas": "0" }, "mappings": { "man": { "properties": { "name": { "type": "text" }, "country": { "type": "keyword" }, "age": { "type": "integer" }, "date": { "type": "date", "format": "yyyy-MM-dd HH:ss:dd||yyyy-MM-dd" } } }, "woman": {} } } 含義解釋:建立一個名為people的索引,分片數為3,備份數為0;索引裡有兩個型別man, woman(表示有兩個table:man and woman),man這個table中有欄位name,country,age,date。woman沒有欄位 2)、資料插入: 指定文件id插入: PUT http://localhost:9200/people/man/1 body:{ "name": "段鬆鬆", "country": "China", "age": 25, "date": "1994-05-06" } 給man這個type插入一條文件id為1的記錄 不指定文件id,讓Elasticsearch自動生成文件id POST http://localhost:9200/people/man body:{ "name": "段鬆鬆", "country": "China", "age": 25, "date": "1994-05-06" } 3)、資料修改 直接修改文件: POST http://localhost:9200/people/man/1/_update(_update表示是修改操作) body:{ "doc": { "name": "誰是段鬆鬆" } } 通過指令碼修改文件 POST http://localhost:9200/people/man/1/_update(_update表示是修改操作) body:{ "script": { "lang": "painless", "inline": "ctx._source.name = params.name;ctx._source.age = params.age", "params": { "age": 100, "name": "段鬆鬆" } } } "lang": "painless" --表示es內建的指令碼語言 "params" --定義了一些引數 ctx._source --表示當前文件的物件 4)、刪除(沒有刪除型別的方法) 刪除文件:Delete http://localhost:9200/people/man/1 刪除索引:Delete http://localhost:9200/people 5)、查詢Elasticsearch中的資料 GET http://localhost:9200/book/novel/1 查詢book索引下novel型別下的文件id是1的記錄 POST http://localhost:9200/book/_search --查詢book索引下的所有資料 http://localhost:9200/book/novel/_search --查詢book索引novel型別下的所有資料 (_search是關鍵字) body:{ "query": { "match_all": {} }, "from": 1, "size": 1, "sort": [{ "publish_date": {"order": "desc"} }] } query 關鍵字 , from從第幾條開始返回,size返回的條數 match_all 表示匹配所有,當要條件查詢時,使用 "match": { "title": "2" } 模糊查詢 結果預設是升序排序 "sort": [{ "publish_date": {"order": "desc"} }] 表示通過 publish_date 欄位降序排序 聚合查詢 POST http://localhost:9200/book/novel/_search { "aggs": { "group_by_word_count": { "terms": { "field": "word_count" } }, "grades_word_count": { "stats": { "field": "word_count" } } } } aggs -- 關鍵字 ,group_by_word_count --自定義的聚合名,terms --關鍵字, "field": "word_count" --通過word_count來分組聚合查詢 通過多個欄位和聚合,再多加 group_by_word_count 這種即可 stats -- 關鍵字,表示通過word_count欄位計算,max、min、sum、avg、count等等,也可以吧stats直接改成函式名
5、ElasticSearch高階查詢
1)、query context:
es在查詢過程中,除了判斷文件是否滿足查詢條件外,還有計算一個_score來標識匹配的程度,表明判斷目標文件和查詢條件匹配的有多好
a)、全文字查詢,針對文字型別的資料text
POST http://localhost:9200/book/_search api
模糊匹配:{"query": {"match": {"author": "瓦力"}}} --因為 author欄位是keyword型別,所以這裡要是全匹配,而不是模糊查詢
{"query": {"match": {"title": "ElasticSearch"}}} title 是text文字格式,所以這裡是模糊查詢 返回結果有 "_score": 0.25316024, 表示匹配程度
{"query": {"match": {"title": "ElasticSearch入門"}}} 這樣的模糊查詢,會查詢title中包括ElasticSearch 或者 入門 的所有記錄
習語匹配:
{"query": {"match_phrase": {"title": "ElasticSearch入門"}}} 這樣會對title進行全匹配,相當於 = 符號
多個欄位模糊匹配:
{"query": {"multi_match": {"query": "瓦力", "fields": [{"author","title"}]}}}} 查詢author或者title中包含 瓦力 的記錄,這裡相當於 author=瓦力 or tilte like 瓦力
query_string:通過一些語法來進行查詢
{"query": {"query_string": {"query": "(ElasticSearch AND 大法) OR Python"}}} 查詢包括(ElasticSearch並且包括 大法) 或者 (Python)的資料,這裡沒有指定欄位,查全部欄位,而且 AND 和 OR 必須大寫
要指定查詢的欄位,則加上"fileds": ["author","title"]
b)、欄位級別的查詢,針對結構化資料,如數字,日期,這個也可以針對keyword型別的欄位
{"query": {"term": {"word_count": 1000}}} 查詢word_count是1000的記錄
範圍查詢:{"query": {"range": {"word_count": {"gte": 1000,"lte": 2000}}}} 查詢word_count在大於等於1000,小於等於2000的記錄 ,當對時間欄位進行篩選時,現在的時間使用 now 關鍵字
2)、Filter context 過濾查詢
這個只會返回是否查到資料,不會返回匹配的程度
a)、{"query": {"bool": {"filter": {"term": {"word_count": 1000}}}}} 過濾查詢 word_count 為1000的記錄,filter要結合bool關鍵字一起查詢,並且會把資料進行快取到記憶體
3)、複合查詢
a)、固定分數查詢
{
"query": {
"constant_score": {
"filter": {
"match": {
"title": "ElasticSearch"
}
},
"boost": 2
}
}
} constant_score 表示固定分數 , "boost": 2 表示指定分數為2
b)、bool關鍵字的查詢
{
"query": {
"bool": {
"should": [
{
"match": {
"author": "瓦力"
}
},
{
"match": {
"title": "ElasticSearch"
}
}
]
}
}
} 這個方式使用了should關鍵字。表示滿足這兩個match之一的記錄
{
"query": {
"bool": {
"must": [
{
"match": {
"author": "瓦力"
}
},
{
"match": {
"title": "ElasticSearch"
}
}
],
"filter": [{
"term": {
"word_count": 1000
}
}]
}
}
} 這個方式使用了must關鍵字。表示要同事滿足這兩個match的記錄. 同時與filter關鍵字一起使用
{
"query": {
"bool": {
"must_not": {
"term": {
"author": "瓦力"
}
}
}
}
} must_not關鍵字,表示author不是瓦力的記錄