# springboot-Elasticsearch **Repository Path**: juniorshy/springbootElasticsearch ## Basic Information - **Project Name**: springboot-Elasticsearch - **Description**: springboot整合elasticsearch,jest与Spring Data Elasticsearch使用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-10-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springboot整合elasticsearch,jest与Spring Data Elasticsearch使用 ## springbootelasticsearch ### 笔记 Elasticsearch Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合: Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库--无论是开源还是私有。 但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理。Lucene 非常 复杂。 Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。 https://www.elastic.co/guide/cn/elasticsearch/guide/current/getting-started.html 索引雇员文档编辑 第一个业务需求就是存储雇员数据。 这将会以 雇员文档 的形式存储:一个文档代表一个雇员。存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。 一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。 Index Versus Index Versus Index 你也许已经注意到 索引 这个词在 Elasticsearch 语境中包含多重意思, 所以有必要做一点儿说明: 索引(名词): 如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。 索引(动词): 索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到。这非常类似于 SQL 语句中的 INSERT 关键词,除了文档已存在时新文档会替换旧文档情况之外。 倒排索引: 关系型数据库通过增加一个 索引 比如一个 B树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。 默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。我们将在 倒排索引 讨论倒排索引的更多细节。 对于雇员目录,我们将做如下操作: - 每个雇员索引一个文档,包含该雇员的所有信息。 - 每个文档都将是 `employee` *类型* 。 - 该类型位于 *索引* `megacorp` 内。 - 该索引保存在我们的 Elasticsearch 集群中。 实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作: ```json PUT /megacorp/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } ``` 注意,路径 /megacorp/employee/1 包含了三部分的信息: megacorp 索引名称 employee 类型名称 1 特定雇员的ID 请求体 —— JSON 文档 —— 包含了这位员工的所有详细信息,他的名字叫 John Smith ,今年 25 岁,喜欢攀岩。 https://www.elastic.co/guide/cn/elasticsearch/guide/current/_indexing_employee_documents.html #### 笔记Spring Data Elasticsearch Spring Data存储库抽象中的中央接口Repository(可能不是那么令人惊讶)。它将域类和域类的id类型作为类型参数进行管理。此接口主要用作标记接口,用于捕获要使用的类型,并帮助您发现扩展此接口的接口。该CrudRepository规定对于正在管理的实体类复杂的CRUD功能。 示例1. CrudRepository接口 ```java public interface CrudRepository extends Repository { S save(S entity); Optional findById(ID primaryKey); Iterable findAll(); long count(); void delete(T entity); boolean existsById(ID primaryKey); // … more functionality omitted. } ``` 保存给定的实体。 返回由给定id标识的实体。 返回所有实体。 返回实体数量。 删除给定的实体。 指示是否存在具有给定id的实体。 https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/ #### 笔记JestClient Elasticsearch https://github.com/searchbox-io/Jest/tree/master/jest 用法 只需创建一个JestClient实例即可开始使用Jest : //根据配置通过工厂 ```java // Construct a new Jest client according to configuration via factory JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(new HttpClientConfig .Builder("http://localhost:9200") .multiThreaded(true) //Per default this implementation will create no more than 2 concurrent connections per given route .defaultMaxTotalConnectionPerRoute() // and no more 20 connections in total .maxTotalConnection() .build()); JestClient client = factory.getObject(); ``` 用例 ```java @Autowired JestClient jestClient; @Test public void contextLoads() { //1、给Es中索引(保存)一个文档 Article article=new Article(1,"消息","zhangsan","hello world"); //构建一个索引功能 Index Index = new Index.Builder(article).index("asd").type("news").build(); try { jestClient.execute(Index); } catch (IOException e) { e.printStackTrace(); } } @Test public void search(){ String json="{\n" + " \"query\" : {\n" + " \"match\" : {\n" + " \"content\" : \"hello\"\n" + " }\n" + " }\n" + "}"; Search build = new Search.Builder(json).addIndex("asd").addType("news").build(); try { SearchResult result = jestClient.execute(build); System.out.println(result.getJsonString()); } catch (IOException e) { e.printStackTrace(); } /* {"took":360,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0}, "hits":{"total":1,"max_score":0.25811607,"hits":[{"_index":"asd","_type":"news","_id":"1", "_score":0.25811607,"_source":{"id":1,"title":"消息","author":"zhangsan","content":"hello world"}}]}} */ } ``` Docker 记录: 2019年8月17日,es官网的7.3-6.8和boot2.1.7无法适配:环境win 记录: 2019年8月19日,VM VirtualBox 上centos7 安装 运行docker 版本 Docker version 1.13.1, build 7f2769b/1.13.1 安装的镜像 REPOSITORY TAG docker.io/redis 5.0.5 docker.io/mysql 5.7.27 docker.io/kibana 6.5.3 docker.io/elasticsearch 6.5.3 docker.io/mobz/elasticsearch-head 5 其中elasticsearch docker exec -it 2856d814d77ded1e5ff0a1ee754e1c2ec9961d0567ec0d6a395fdaa1623b6f43 /bin/bash 在elasticsearch.yml添加了 http.cors.enabled: true http.cors.allow-origin: "*" 解决elasticsearch-head无法访问es的问题 并在plugins内执行 wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.3/elasticsearch-analysis-ik-6.5.3.zip 然后mkdir ik 创建ik文件夹 unzip elasticsearch-analysis-ik-6.5.3.zip -d ik/ rm -f elasticsearch-analysis-ik-6.5.3.zip 重启docker的elasticsearch镜像 运行EssearchApplicationTests @Test public void save() 查看插入数据 待解决问题,容器随docker自动启动