# es-tutorials-parent **Repository Path**: coder_chenjun/es-tutorials-parent ## Basic Information - **Project Name**: es-tutorials-parent - **Description**: elastic-search的使用以及与spring、springboot的整合使用等 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-11-16 - **Last Updated**: 2023-11-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 版本说明 本文基于以下几个版本 - spring boot 2.5.6 - elasticsearch 7.15.2 - elasticsearch-high-level-client:7.15.2 - ik分词器7.15.2 > spring boot 2.5.6 版本默认使用的elasticsearch的rest-high-level-client版本为7.12.1. 但elasticsearch软件版本是7.15.2是可以使用的。 > > springboot中保留high-level-client的7.12.1版本,不要更改为7.15.2版本 # 安装与学习文档 > https://www.elastic.co/cn/what-is/elk-stack ![elk stack](images/elk stack.png) 什么是 ELK Stack?很简单,指的就是 Elastic Stack。 “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elastic Stack 是 ELK Stack 的更新换代产品。 ***Elasticsearch*** 这个开源的分布式搜索引擎基于 JSON 开发而来,具有 RESTful 风格。它使用简单,可缩放规模,十分灵活,因此受到用户的热烈好评,而且如大家所知,围绕这一产品还形成了一家专门致力于搜索的公司。 ***Logstash 和 Kibana*** Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,我们引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。 ***Beats*** 2015 年,我们向 ELK Stack 中加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats。Beats是ELK Stack技术栈中负责单一用途数据采集并推送给Logstash或[Elasticsearch](https://so.csdn.net/so/search?from=pc_blog_highlight&q=Elasticsearch)的轻量级产品 ![beats_logstash](images/beats_logstash.png) ELK 这个名称又要变了,的确如此。把它叫做 BELK?BLEK?ELKB?当时的确有过继续沿用首字母缩写的想法。然而,对于扩展速度如此之快的堆栈而言,一直采用首字母缩写的确不是长久之计。就这样,Elastic Stack 这个名字应运而生了 ## 官网资料 进入官网之后,点击导航栏里“学习”->"文档"就打开了https://www.elastic.co/guide/index.html页面,此页面就展示了所有的学习资料,主要的资料是指南和参考手册 ![elk_doc](images/elk_doc.png) 重点的学习文档就是参考手册,也就是Store,Search,And Analyze一节中的ElasticSearch Guide文档。在此文档中,重要的是如下图所示的几个重点章节的学习,特别是`REST APIs`章节会成为日后经常查阅的地方 ![reference_doc](images/reference_doc.png) ## 安装es 在window平台下安装只需要解压下载的压缩包即可,最后执行bin目录下的elasticsearch.bat文件即可启动es ### 配置远程访问 如果要修改es的配置就到config目录下的elasticsearch.yml文件中进行修改即可,默认情况下,此文件没有任何的有效配置,里面全部是注释。 如果要开启远程访问,需要配置两个条目,缺一不可,其中network.host条目需要配置为本机ip地址,不能配置为localhost,否则远程没法访问,但本地也不能通过localhost访问了 ```yaml network.host: 172.16.5.218 discovery.seed_hosts: ["127.0.0.1", "[::1]"] ``` ### 配置环境变量 > https://blog.csdn.net/luckyming_520/article/details/105226432 这篇文章里有各种启动相关问题的解决办法 从es7开始其就自带一个jdk了(在安装目录jdk里),但如果运行环境中已经配置了`JAVA_HOME`,那么还是会用环境变量指定的java运行环境来运行es,想用自带的java环境运行jdk,要么删掉环境变量`JAVA_HOME`,要么更改文件`elasticsearch-env.bat` 或者直接添加一个环境变量`ES_JAVA_HOME`指向安装自带的jdk目录,比如`D:\elasticsearch-7.15.2\jdk` 下面是elasticsearch-env.bat文件的关于环境变量部分的核心代码 ```bat if defined ES_JAVA_HOME ( set JAVA="%ES_JAVA_HOME%\bin\java.exe" set JAVA_TYPE=ES_JAVA_HOME ) else if defined JAVA_HOME ( rem fallback to JAVA_HOME echo "warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME" >&2 set JAVA="%JAVA_HOME%\bin\java.exe" set "ES_JAVA_HOME=%JAVA_HOME%" set JAVA_TYPE=JAVA_HOME ) else ( rem use the bundled JDK (default) set JAVA="%ES_HOME%\jdk\bin\java.exe" set "ES_JAVA_HOME=%ES_HOME%\jdk" set JAVA_TYPE=bundled JDK ) ``` ## 安装分词插件 插件在https://github.com/medcl/elasticsearch-analysis-ik,此网页有详细的安装与配置说明 安装的时候插件的版本要与es的版本是一致的,否则安装不成功,可以采用两种方法安装 - 压缩包安装 - 到https://github.com/medcl/elasticsearch-analysis-ik/releases下载对应压缩包 - 在es的plugins目录下建立一个ik目录 - 把压缩包的内容全部解压到ik目录 - 重启es即完成插件安装 - elasticsearch-plugin命令安装 - 执行命令`./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.15.2/elasticsearch-analysis-ik-7.15.2.zip` - 重启es即完成插件安装 ## 安装head插件 head是一个用于管理Elasticsearch的web前端插件,该插件在es5版本以后采用独立服务的形式进行安装使用(之前的版本可以直接在es安装目录中直接安装) 此插件采用js编写,通过ajax的方式与es进行通信,所以想让此插件运行一般会让es开启跨域支持,并且要运行此插件需要安装nodejs、npm及相关的依赖库 ### 下载插件 在https://github.com/mobz/elasticsearch-head/tags下载插件的zip压缩包或者执行下面的命令克隆此开源项目 ```shell git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head ``` ### 安装node与依赖 安装grunt-cli ```shell npm install -g grunt-cli ``` > grunt是一个构建工具,与其齐名的还有gulp,类似于java中的maven、gradle等工具,可以在https://www.gruntjs.net/学习了解grunt 接着安装相关的依赖包 ```shell npm install ``` ### 修改配置 修改gruntfile.js文件,在server.options里面添加hostname ```json connect: { server: { options: { hostname:'0.0.0.0', port: 9100, base: '.', keepalive: true } } } ``` 在_site/app.js文件里面修改es的地址,把地址改为es的地址,比如`127.0.0.1:9200` ```js this.prefs.get("app-base_uri") || "http://127.0.0.1:9200"; ``` ### 跨域访问 在es的配置文件elasticsearch.yml中增加允许跨域的设置 ```yaml http.cors.enabled: true http.cors.allow-origin: "*" ``` ### 启动运行 运行`npm run start`命令启动插件的运行,这样就可以在浏览器中输入地址`http://localhost:9100`来使用插件了,它会自动连接到es ## 导入测试数据 https://gitee.com/xlh_blog/common_content/blob/master/es%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE.json#这个网址有es官方网址使用的测试数据(github卡),在postman中采用post提交,地址为localhost:9200/bank/account/_bulk?pretty&refresh ,在body内直接粘贴测试数据即可导入这些测试数据 # 索引 下图是最基础的es使用步骤,包含如下步骤 - 创建索引 - 建立结构 - 添加数据 - 查询数据 ![es_operation_step](images/es_operation_step.png) # 映射(Mapping) # 文档 # 搜索 ## 使用分词器 TODO:还没有说明分词器如何应用在搜索中,只有在mapping中设定一种途径? 在官方参考手册的`text analysis`一节有关于使用分词器的说明,下面的是使用标准分词器的用法 ```http GET 127.0.0.1:9200/_analyze?pretty { "analyzer":"standard", "text":"我是中国人" } ``` 结果是 ```json { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "", "position": 1 }, { "token": "中", "start_offset": 2, "end_offset": 3, "type": "", "position": 2 }, { "token": "国", "start_offset": 3, "end_offset": 4, "type": "", "position": 3 }, { "token": "人", "start_offset": 4, "end_offset": 5, "type": "", "position": 4 } ] } ``` 改成ik_max_word分词器 ```json { "analyzer":"ik_max_word", "text":"我是中国人" } ``` 结果是 ```json { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "中国人", "start_offset": 2, "end_offset": 5, "type": "CN_WORD", "position": 2 }, { "token": "中国", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 3 }, { "token": "国人", "start_offset": 3, "end_offset": 5, "type": "CN_WORD", "position": 4 } ] } ``` 改成ik_smart分词器之后,结果是 ```json { "tokens": [ { "token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 }, { "token": "中国人", "start_offset": 2, "end_offset": 5, "type": "CN_WORD", "position": 2 } ] } ``` # java操作ES ## springboot中使用 ### ElasticsearchRestTemplate ```java @RequestMapping("") public void index() { NativeSearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.matchQuery("content", "中国")) .build(); SearchHits hits = template.search(query, SearchModel.class, IndexCoordinates.of("index")); for (SearchHit hit : hits.getSearchHits()) { System.out.println(hit.getContent()); } } // @Data public class SearchModel { private String content; } ``` # 常见问题 - ik插件安装到有空格的目录,比如programs files ,会在启动的时候报ik的配置文件无法访问的问题 - 启动不了,说内存不够,关掉一些耗内存的程序或者修改es的配置 - 没有权限的错误,修改文件的权限 # 参考资料 https://www.elastic.co/guide/en/elastic-stack-get-started/index.html https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html https://my.oschina.net/u/4403110/blog/4565352(列出了必须掌握的内容) https://blog.csdn.net/qq_34168515/article/details/108428406 (简单的crud) https://segmentfault.com/a/1190000014347757 (head插件安装) https://blog.csdn.net/dkjhl/article/details/95958964 (head插件安装) https://juejin.cn/post/6844904126321524744 (es商品搜索案例) https://segmentfault.com/a/1190000020250729(es商品搜索案例) https://cloud.tencent.com/developer/article/1634054 (es商品搜索案例) https://cloud.tencent.com/developer/article/1487737 (es商品搜索案例) https://segmentfault.com/a/1190000022799288 (es应用场景)