最近博主有一些elasticsearch的工做,因此更新的慢了些,如今就教你們快速入門,並對一些基本的查詢、更新需求作一下示例,廢話很少說開始:html
1. ES快速上手java
es下載:[https://elasticsearch.cn/download/]()這裏關於es所須要的連接基本都有,能夠快速下載使用
當你解壓好了歸檔文件以後,Elasticsearch 已經準備好運行了node
1 cd elasticsearch-<version> 2 ./bin/elasticsearch json
es默認端口9200;transport端口是9300;transport端口主要用來java客戶端操做,啓動成功後,咱們來安裝一下kibana界面操做es的工具,也能夠下載header,可是kibana界面比較友好而且最後部署ELK的時候也須要該工具,因此博主就直接安裝kibana了服務器
kibana下載:[https://elasticsearch.cn/download/]()仍是跟es同樣的連接,下載後解壓並編輯config目錄下編輯kibana.yml文件,主要配置以下:架構
1 server.port: 15601 app
1 server.host: "0.0.0.0" elasticsearch
1 elasticsearch.hosts: ["http://localhost:9200"] 分佈式
只須要修改這幾處配置就能夠,前提是kibana的版本必須與es的版本是相同的,不然會包不少錯誤,而且啓動失敗,Linux啓動時不能使用root用戶啓動,必須本身添加我的用戶才能夠,命令以下:工具
添加用戶: 1 useradd testuser
設置密碼: 1 passwd testuser
將咱們的文件夾用戶權限改變一下要否則啓動時候總是提示沒有權限: 1 chown -R testuser:testuser kibana
如今進入咱們kibana的文件夾,以testuser啓動kibana: 1 /bin/kibana
訪問地址:http://localhost:15601
當看到這裏的時候就已經OK了,咱們終於能夠開始使用es了。
我就不介紹es是幹啥用的了,es具備分片的概念,分爲主分片和副本分片,建立索引的時候一旦設置副本分片,必須有大於等於2臺的機器,每一個機器都有es,es之間的交互,須要本身在配置文件中做修改,不然不配置,永遠只是單機,而且主分片在建索引的時候必須考慮清楚減多少個主分片,由於之後若是須要修改主分片,必須從新建立索引,你添加或則減小一個主分片,es往分片中存放數據的時候都會變,可是副本分片不同,由於他是數據冗餘的,一旦主分片宕機,副本會當選主分片,而且是要主分片存在,副本沒有也能夠,副本的做用就是提升數據的吞吐量。好了,開始實戰:
點擊kibana的Dev Tools按鈕,就能夠在面板裏寫語句操做索引了:
創建索引:shards主分片 replicas副本分片設置的數量,看你有幾臺機器-1
PUT /test { "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "_doc": { "properties": { "name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "age": { "type":"integer" } } } } }
創建mappings作好字段類型,而且text類型中使用分詞器,不要使用默認的分詞器,默認的分詞器一個漢字分一個,查詢出來基本沒啥價值,中文分詞器是ik,能夠上網搜一下下載到es裏面。
你們上過語文課,都知道語句有歧義問題,就好比武漢市長江大橋,能夠斷成武漢市長、江大橋;武漢市、長江大橋;這就是分詞器如何切分的問題,因此es有關鍵字查詢term,進行徹底匹配,不進行分詞器query匹配,除了這些,中文還有同義詞一說,好比蘋果水果與蘋果手機,你們搜索的時候基本都是輸入蘋果,可是出來的倒是蘋果手機,水果不多,這就是由於es也能夠作同義詞查詢。可是須要配置同義詞文件,具體操做能夠自行上網解決,主要就是建立索引的時候,使用本身在config中編輯的文本文件,該文件中有本身要使用到的同義詞,好比:iPhone,蘋果手機;
咱們如今再來進行實戰開發,本人接觸的是使用ElasticsearchRestTemplate進行開發,該類基本含括了大部分需求開發查詢。下面開始舉例:
搜索查詢:
1 String[] includes = new String[] { 2 "paperBaseId" 3 ,"auditInfoStatus" 4 }; 5 SourceFilter sourceFilter = new FetchSourceFilterBuilder().withIncludes(includes).build(); 6 SearchQuery searchQuery = new NativeSearchQueryBuilder() 7 .withSourceFilter(sourceFilter) 8 // 添加查詢條件 9 .withQuery(QueryBuilders.termsQuery("paperBaseId",paperBaseId)) 10 .build(); 11 List<EsPaperBase> esPaperBaseList = elasticsearchRestTemplate.queryForList(searchQuery,EsPaperBase.class);
1 //單索引匹配更新 2 Map<String, Object> params = new HashMap<String, Object>(); 3 params.put("flag", deleteFlag); 4 //ctx._source即爲該索引自己 5 String code = "ctx._source.deleteFlag=params.flag;"; 6 ScriptType type = ScriptType.INLINE; 7 //使用腳本進行更新字段值 8 Script script = new Script(type, Script.DEFAULT_SCRIPT_LANG, code, params); 9 10 UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(); 11 updateByQueryRequest.indices("exam_information");//設置索引 12 updateByQueryRequest.setDocTypes("doc");//設置文檔,固定doc 13 updateByQueryRequest.setQuery(QueryBuilders.termsQuery("paperBaseId", paperBaseId));//設置查詢 14 updateByQueryRequest.setScript(script);//若是有腳本,則添加 15 updateByQueryRequest.setConflicts("proceed"); // 設置版本衝突時繼續 16 updateByQueryRequest.setRefresh(true);//請求結束後,對咱們寫入的索引進行調用刷新 17 this.elasticsearchTemplate.getClient().updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);//進行更新
1 //多索引匹配批量更新 2 Map<String,Object> updateMap = new HashMap<>(); 3 updateMap.put("deleteFlag",deleteFlag); 4 updateMap.put("lastUpdateTime",currDatetime); 5 UpdateRequest doc = new UpdateRequest().doc(updateMap); 6 List<UpdateQuery> updateQuerys = new ArrayList<>(); 7 //生成批量更新操做 8 paperBaseId.stream().forEach(id ->{ 9 UpdateQuery build = new UpdateQueryBuilder() 10 .withUpdateRequest(doc) 11 .withDoUpsert(true) 12 .withIndexName("paper_base") 13 .withType("doc") 14 .withId(id).build(); 15 updateQuerys.add(build); 16 }); 17 elasticsearchTemplate.bulkUpdate(updateQuerys,BulkOptions.builder().withRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).build()); 18
1 //查詢操做 2 MatchQueryBuilder lastUpdateUser = QueryBuilders.matchQuery("personId", userId); 3 MatchQueryBuilder deleteflag = QueryBuilders.matchQuery("deleteFlag", BaseEntity.DEL_FLAG_DELETE); 4 //建立bool多條件查詢 5 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); 6 BoolQueryBuilder mustQuery = boolQueryBuilder.must(lastUpdateUser).must(deleteflag); 7 //嵌套索引,須要使用nest查詢 8 mustQuery.must(QueryBuilders.nestedQuery("entityNodes", QueryBuilders.termQuery("entityNodes.node_type", recyclePaperDTO.getNodeType()), ScoreMode.None)); 9 //可使用should查詢,不是必需條件 10 BoolQueryBuilder nodeQueryBuilder = QueryBuilders.boolQuery(); 11 nodeQueryBuilder.should(QueryBuilders.nestedQuery("entityNodes", QueryBuilders.wildcardQuery("entityNodes.parent_ids", "*," + recyclePaperDTO.getNodeId() + "*"), ScoreMode.None)); 12 nodeQueryBuilder.should(......); 13 mustQuery.must(nodeQueryBuilder); 14 //查詢使用排序 15 SortBuilder order = new FieldSortBuilder("lastUpdateTime").order(SortOrder.DESC); 16 //可使用高亮顯示,就是html標籤 17 HighlightBuilder highlightBuilder = new HighlightBuilder(); 18 highlightBuilder.preTags("<span class='highlighted'>") 19 .postTags(</span>) 20 .field("paperBaseName");//哪一個字段高亮 21 //使用分頁查詢 22 SearchQuery nativeSearchQueryBuilder = new NativeSearchQueryBuilder() 23 .withQuery(mustQuery).withSort(order).withHighlightBuilder(highlightBuilder) 24 .withPageable(PageRequest.of(recyclePaperDTO.getPageNum()-1, recyclePaperDTO.getPageSize())).build(); 25 //進行查詢,entityMapper使用默認的也可,EsPaperBase.class是須要本身映射的查詢類 26 elasticsearchTemplate.queryForPage(nativeSearchQueryBuilder, EsPaperBase.class, new HighlightResultMapper(entityMapper)); 27
1 @Data 2 @Builder 3 @NoArgsConstructor 4 @AllArgsConstructor 5 @Document(indexName = "paper_base", type = "doc") 6 @Setting(settingPath = "/elasticsearch/settings.json")//可設置主分片、副本分片、設置默認停用詞等 7 public class EsPaperBase { 8 9 @Id 10 @Field(type = FieldType.Keyword, name = "paperBaseId") 11 private String paperBaseId; 12 13 /** 14 * 試卷名稱 15 */ 16 @MultiField(mainField = @Field(type = FieldType.Text, analyzer = "standard" , name = "paperBaseName"), 17 otherFields = { 18 @InnerField(suffix = "zh", type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart"), 19 @InnerField(suffix = "en", type = FieldType.Text, analyzer = "english"), 20 }) 21 private String paperBaseName; 22 23 /** 24 * 共享級別名,可使用分詞器查詢,模糊匹配 25 */ 26 @Field(type = FieldType.Text, name = "shareLevelName") 27 private String shareLevelName; 28 29 30 /** 31 * 建立人,不可以使用分詞器查詢,精準匹配 32 */ 33 @Field(type = FieldType.Keyword, name = "personId") 34 private String personId; 35 36 37 /** 38 * 建立時間 39 */ 40 @Field(type = FieldType.Date, name = "createtime", format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") 41 private String createtime; 42 43 /** 44 * 更新時間 45 */ 46 @Field(type = FieldType.Date, name = "lastUpdateTime", format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") 47 private String lastUpdateTime; 48 49 /** 50 * 刪除標識 0:未刪除,1:已刪除 51 */ 52 @Field(type = FieldType.Keyword, name = "deleteFlag") 53 private String deleteFlag; 54 /** 55 * 試卷推薦,內嵌字段 56 */ 57 @Field(type=FieldType.Nested,name="paperRecommends") 58 private List<EsPaperRecommend> paperRecommends; 59 60 ...... 61 }
1 {//setting.json 2 "index": { 3 "number_of_shards": "5", 4 "number_of_replicas": "2", 5 "refresh_interval": "1s", 6 "max_rescore_window": 10000000 7 }, 8 "analysis": { 9 "filter": { 10 "spanish_stop": { 11 "type": "stop", 12 "stopwords": [ "si", "esta", "el", "la" ] 13 }, 14 "light_spanish": { 15 "type": "stemmer", 16 "language": "light_spanish" 17 } 18 }, 19 "analyzer": { 20 "my_spanish": { 21 "tokenizer": "spanish", 22 "filter": [ //順序很重要 23 "lowercase", 24 "asciifolding", 25 "spanish_stop", 26 "light_spanish" 27 ] 28 } 29 } 30 } 31 }
如今不少公司基本使用分佈式架構應用,公司每一個應用模塊都有好幾臺機器,看日誌問題也就衍生而來,咱們最笨的方法就是每一個服務器後臺都打開進行查看,效率低下,此時,咱們就可使用es、kibana、logstash;簡稱ELK進行查看分佈式日誌系統,可是本文不會進行安裝logstash進行演示,由於只作日誌查詢的需求,咱們使用ELK的變種EFK便可,filebeat輕量級作日誌收集便可,最主要的就是看咱們如何進行配置,而後使用kibana進行查詢日誌。
安裝完logstash後,解壓在config中新建my-logstash.conf,該配置中注意三大塊,input、filter、output;其中input是做爲吸收日誌的以.log爲後綴的日誌文件,filter是過濾配置,不用管,output則是導入到哪一個elasticsearch中;配置以下:
1 input { 2 file { 3 type => "log" 4 path => ["/apps/svr/server/*/log.file"] 5 start_position => "end" 6 ignore_older => 0 7 codec=> multiline { 8 pattern => "^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}" 9 negate => true 10 auto_flush_interval => 5 11 what => "previous" 12 } 13 } 14 beats { 15 port => 5044 16 } 17 } 18 output { 19 if [type] == "log" { 20 elasticsearch { 21 hosts => ["http://127.0.0.1:19200"] 22 index => "logstash-%{+YYYY.MM}" 23 #user => es 24 #password => es2018 25 } 26 } 27 }
若是本身動手配置的話,最好本身手動輸入,不要複製粘貼,頗有可能會有特殊字符出現致使啓動失敗;啓動命令:./bin/logstah -f my-logstash.conf
最終咱們就能夠這樣使用kibana進行查詢日誌的操做了。簡單的基本應用就到此爲止了,工做中基礎的應用是沒有問題了;最後記得關注本博主的公衆號啊!