https://www.bilibili.com/video/av21943111/?spm_id_from=333.788.videocard.3node
Elastic Search 簡稱ES,支持PB級的結構化或者非結構化數據處理;mysql
(一)ES 單實例的安裝web
1. 下載連接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gzsql
2.tar -zxvf 解壓下載的tar.gz 包數據庫
3.進入解壓後的elasticsearch目錄中,進入bin 目錄npm
4. ./elasticsearch 啓動 默認端口9200json
安裝插件head 提供友好的web 界面(須要node 環境>6.0):api
1.GitHub 查找 elasticsearch-head 進行下載跨域
2.進入解壓後的目錄 執行 npm install服務器
3.修改elasticsearch 安裝目錄下 config目錄 下的 elasticsearch.yml
4.添加跨域請求配置:
http.cors.enabled: true http.cors.allow-origin: "*"
5.npm run start 啓動head
---------至此,單示例的安裝就算完成了
(二)ES 集羣部署的安裝:
集羣部署的安裝主要是操做config 目錄下的 elasticsearch.yml 文件
咱們首先看master 的配置:
#配置cluster 名字 cluster.name: iscys #節點的名字 node.name: master #代表當前的節點是master node.master: true
#綁定的端口,默認9200
network.host: 127.0.0.1
咱們看slave 的配置:
#名字要與主節點一致(集羣這個名字都要一致)
cluster.name: iscys
#節點的名字 node.name: slave network.host: 127.0.0.1
#端口 http.port: 8200
#用於發現主節點
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
****注意:在Linux 中安裝運行,必須是非root 用戶而且文件夾所屬也是該用戶,使用chown 進行文件所屬的修改
常見報錯解決方案:
http://blog.itpub.net/15498/viewspace-2149328/
Elastic Search 索引是反向索引又叫倒排索引,根據文章內容中關鍵字進行創建索引
主要要了解索引 類型 文檔 這三個模型概念
索引是用於存放數據的地方,能夠用來理解爲mysql中的一個數據庫
類型是用於定義數據結構的,能夠理解爲mysql 的一張表,類型咱們能夠經過Mapping 來定義每一個字斷的類型
文檔就說最終的數據
-----
API 基本格式:
http://<ip>:<port>/<索引>/<類型>/<文檔ID>
使用postman進行索引類型的建立 put 請求 127.0.0.1:9200/book
{
"settings":{
"number_of_shards": 3,//分片數
"number_of_replicas":1//副本數
}
,
"mappings":{
"books" :{
"properties":{
"id":{
"type":"integer"//in t
},
"name":{
"type":"text"
},
"author":{
"type":"text"
},
"country":{
"type":"keyword"//改字段不會被切分
},
"date":{
"type":"date",
"format":"yyyy-MM-dd||epoch_millis"
}
}
}
}
}
通過上面操做就會在es 中添加book的索引以及索引類型的映射books;
Rest API 操做(基於SpringBoot):
pom 文件:
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.5.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.5.2</version> </dependency>
2.配置client 端:
@Bean public TransportClient esClient(){ InetSocketTransportAddress address =new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1",9300)); Settings settings =Settings.builder().put("cluster.name","iscys").build(); TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(address); return client; }
3.構造添加es 文檔信息api: 返回文檔惟一ID
Books books =new Books(); books.setAuthor("iscys"); books.setCountry("運城"); books.setDate(new Date().getTime()); books.setId(2); books.setName("武俠小說"); byte[] bytes = bi.writeValueAsBytes(books); IndexResponse indexResponse = client.prepareIndex("book", "books").setSource(bytes, XContentType.JSON).get(); String id = indexResponse.getId(); System.out.println(id);
4.查詢這個是重點,須要一步一步的挖掘:->具體請看--->http://www.javashuo.com/article/p-tbzuoeug-a.html
查詢主要使用的是 QueryBuilders 進行構建查詢器,而後指定索引以及類型進行查詢
(1). 查詢全部的文檔(match_all):
//預查詢指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //構建一個匹配全部的文檔的查詢器 MatchAllQueryBuilder match_all = QueryBuilders.matchAllQuery(); System.out.println(match_all); SearchResponse books = search .setTypes("books") .setQuery(match_all)//指定查詢器 .get(); System.out.println(books.toString());
咱們經過打印能夠看到match_all其向服務器發送的json 以下:
{ "match_all" : { "boost" : 1.0 } }
(2). 查詢指定字段的文檔(match 模糊匹配)
//預查詢指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //構建一個匹配指定字段的選擇器 name 字段(field) 內容是陳 MatchQueryBuilder match = QueryBuilders.matchQuery("name", "陳"); System.out.println(match); SearchResponse books = search .setTypes("books") .setQuery(match)//指定查詢器 .get(); System.out.println(books.toString());
咱們經過打印能夠看到match_all其向服務器發送的json 以下:
{ "match" : { "name" : { "query" : "陳", "operator" : "OR", "prefix_length" : 0, "max_expansions" : 50, "fuzzy_transpositions" : true, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } } }
(3). (phrase)習語匹配 按短語查詢,只有存在這個短語的文檔纔會被顯示出來。
//預查詢指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //構建一個匹配指定字段的選擇器 name 字段(field) 內容是陳 MatchPhraseQueryBuilder phrase = QueryBuilders.matchPhraseQuery("name", "c陳"); System.out.println(phrase); SearchResponse books = search .setTypes("books") .setQuery(phrase)//指定查詢器 .get(); System.out.println(books.toString());
咱們經過打印能夠看到match_all其向服務器發送的json 以下:
{ "match_phrase" : { "name" : { "query" : "c陳", "slop" : 0, "boost" : 1.0 } } }
(4). (multiMatch)多字段模糊匹配查詢
//預查詢指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //構建一個多字段模糊匹配multiMatchQuery MultiMatchQueryBuilder multi = QueryBuilders.multiMatchQuery("c陳好", "name", "author"); System.out.println(multi); SearchResponse books = search .setTypes("books") .setQuery(multi)//指定查詢器 .get(); System.out.println(books.toString()); //client.prepareDelete("book","books","AWwO0p5geq2bqnybBzqr").get();
咱們經過打印能夠看到match_all其向服務器發送的json 以下:
{ "multi_match" : { "query" : "c陳好", "fields" : [ "author^1.0", "name^1.0" ], "type" : "best_fields", "operator" : "OR", "slop" : 0, "prefix_length" : 0, "max_expansions" : 50, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } }
(5). (term 查詢)結構化查詢,term是將傳入的文本原封不動地(不分詞)拿去查詢。
//預查詢指定索引 SearchRequestBuilder search = client.prepareSearch("book"); //構建一個term 查詢 TermQueryBuilder term = QueryBuilders.termQuery("id", 1); System.out.println(term); SearchResponse books = search .setTypes("books") .setQuery(term)//指定查詢器 .get(); System.out.println(books.toString());
咱們經過打印能夠看到match_all其向服務器發送的json 以下:
{ "term" : { "id" : { "value" : 1, "boost" : 1.0 } } }
(6) 複合查詢,多種條件的集合
布爾查詢:
SearchRequestBuilder search =client.prepareSearch("book"); //bool 查詢 BoolQueryBuilder bool = QueryBuilders.boolQuery(); //篩選 bool.must(QueryBuilders.multiMatchQuery("c","author","name")); bool.must(QueryBuilders.matchQuery("date",1563640592899l)); //過濾 bool.filter(QueryBuilders.termQuery("date","156364059289")); System.out.println(bool); SearchResponse books = search .setTypes("books") .setQuery(bool)//指定查詢器 .get(); System.out.println(books.toString());
打印發送的json 以下:
{ "bool" : { "must" : [ { "multi_match" : { "query" : "c", "fields" : [ "author^1.0", "name^1.0" ], "type" : "best_fields", "operator" : "OR", "slop" : 0, "prefix_length" : 0, "max_expansions" : 50, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } }, { "match" : { "date" : { "query" : 1563640592899, "operator" : "OR", "prefix_length" : 0, "max_expansions" : 50, "fuzzy_transpositions" : true, "lenient" : false, "zero_terms_query" : "NONE", "boost" : 1.0 } } } ], "filter" : [ { "term" : { "date" : { "value" : "156364059289", "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }