最近博主有一些elasticsearch的工作,所以更新的慢了些,现在就教大家快速入门,并对一些基本的查询、更新需求做一下示例,废话不多说开始:

1. ES快速上手

es下载:[https://elasticsearch.cn/download/]()这里关于es所需要的链接基本都有,可以快速下载使用
当你解压好了归档文件之后,Elasticsearch 已经准备好运行了

1 cd elasticsearch-<version> 2 ./bin/elasticsearch

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

1 server.host: "0.0.0.0"

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


ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署的更多相关文章

  1. HFun.快速开发平台(一)=》简述

    [——使用成熟的技术实现了解的业务,关注面向对象,关注业务领域] 偶然的机会又回到了园子,看到上次的文章已是N年前,洽巧近期正在开发一个小程序,标题定为“快速开发平台”有点夸张,算是给自己定个小目标. ...

  2. JeeSite信息化快速开发平台

     平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您 ...

  3. 程序小白如何快速开发OA办公系统

    对于企业开发oa办公系统,成本高,周期长.有些企业花高价购买,购买后受制于软件商,很多功能只能按原来设计需求走,无法升级或者升级慢.这些由于软件商的开发效率低难以及时地响应企业的需求变化,所以就有可能 ...

  4. oa办公系统快速开发工具,助力企业优化升级

    随着互联网的快速发展.信息化 IT 技术的不断进步.移动互联新技术的兴起,不管是大的集团企业还是中小型企业,纸质化的办公模式已不能满足现有需求,构建oa平台,为员工提供高效的办公环境尤其重要. 我们先 ...

  5. 4款java快速开发平台推荐

    JBoss Seam JBoss Seam,算得上是Java开源框架里面最优秀的快速开发框架之一. Seam框架非常出色,尤其是他的组件机制设计的很有匠心,真不愧是Gavin King精心打造的框架了 ...

  6. .NETCore 快速开发做一个简易商城

    介绍 上一篇介绍 <.NETCore 基于 dbfirst 体验快速开发项目>,讲得不太清楚有些多人没看懂.这次吸取教训,将一个简易商城做为案例,现实快速开发. 本案例用于演示或学习,不具 ...

  7. 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx

    LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...

  8. ELK快速入门(一)基本部署

    ELK快速入门一-基本部署 ELK简介 什么是ELK?通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同 ...

  9. 优秀开源平台,前后端分离快速开发平台,一站式多端开发(PC+APP)

    JNPF平台架构介绍 JNPF快速开发平台采用前后端分离技术.采用B/S架构开发,形成一站式开发多端(APP+PC)使用. PC端版本介绍 第一个当然是当下热门的.net core了,运行环境为Vis ...

随机推荐

  1. 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...

  2. PyQt(Python+Qt)学习随笔:QTreeWidget中给树型部件增加顶层项的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget对象创建后,是没有任何项的,要给部件增加项,首先要增加顶层项.顶层项的增加有三 ...

  3. PyQt(Python+Qt)学习随笔:QTreeWidget的columnCount属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件中的每个项有一个或多个文字标签或其他装饰符(如图标),这些内容每个显示为一列.QTreeWi ...

  4. Linux下netstat命令简单操作

    netstat -t :TCP协议 -u :UDP协议 -l :监听 -r :路由 -n :显示IP地址和端口号 常用: netstat -tlun 查看本机监听的端口 netstat -an 查看本 ...

  5. SpringCloud-服务间通信方式

    接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式? 总结:在springcloud中服务间调用方式主要是使用 http restful方式进行服务间调用 1. 基于R ...

  6. 团队作业part3--需求改进&系统设计

    一.需求&原型改进 1. 需求的修改 借鉴其他开发游戏的组的经验以及老师的建议,针对之前的需求分析,作出如下修改: 问题1:这款游戏对玩家的吸引力与驱动性有所不足. 修改1:增加成就系统与排行 ...

  7. Day2 Scrum 冲刺博客

    线上会议: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 纪昂学 总结会议内容,思考自己所分配到的任务 创建一个Cell类,用 ...

  8. CF1416D Graph and Queries

    本题解用于作者加深算法印象,也欢迎各位的阅读. 题目大意 给你一张无向图,并给你两种操作: \(1~v\) :找到当前点 \(v\) 所在的联通块内权值最大的点,输出该点权值并将其权值改为 \(0\) ...

  9. http请求user_agent字段解析

    浏览器的常见User Agent 各字段的解释 浏览器的User Agent字段令人迷惑,例如:某一版本的Chrome访问网络时,User Agent字段如下: Mozilla/5.0 (Window ...

  10. Python不同包之间调用注意事项

    1.不同包之间调用,因为在不同文件夹下,引用的时候加上包名就可以了.运行时,在eclipse直接运行没有问题.但是在,命令行运行时出现找不到模块的错误.原因是,Python只搜索当前目录和内置模块以及 ...