最近博主有一些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进行查询日志的操做了。简单的基本应用就到此为止了,工做中基础的应用是没有问题了;最后记得关注本博主的公众号啊!