[TOC]html
推荐去看官网的文档,有中文的,我这里仅仅是简单的入门一下,作一下我的笔记 ElasticSearch官方文档java
我使用Docker进行安装,使用了中国加速node
docker pull registry.docker-cn.com/library/elasticsearch
而后,开启镜像,生成容器,这里须要注意的是,ElasticSearch默认运行内存占用2个G,我虚拟机整个才给了2G内存,因此我要限制ElasticSearch的内存为最小256M,最大256M,端口号是9200,在分布式的状况下,互通的端口号是9300程序员
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name myElasticSearch 5acf0e8da90b
在浏览器输入你的Linux服务器IP+9200,当你看到下图时就安装成功了spring
ElasticSearch就是一个搜索的东西,维基百科,Github用的都是这个。简单介绍一下,他的原理是这样的,有索引,索引下有类型,类型下有文档,文档有属性sql
能够这么理解,把ElasticSearch看做Mysql,索引就是数据库,类型就是表,文档就是数据,属性就是数据的属性类型docker
put 咱们来往ElasticSearch里面存3条数据,ElasticSearch使用json存储的,格式是shell
PUT /索引/类型/特定标识数据库
我这里提供几个json给大家使用express
{ "first_name":"Vae", "age":32, "about":"许嵩是音乐家", "interests":["music","Photograph"] } { "first_name":"JJ", "age":32, "about":"林俊杰是音乐家", "interests":["music","Dota2"] } { "first_name":"shuyunquan", "age":23, "about":"蜀云泉是程序员", "interests":["music","Photograph"] }
打开postman这个软件,输入http://193.112.28.104:9200/meizu/employee/1
我索引写成魅族公司,注意必须小写,类型写成员工,标识先写1
选择PUT模式,Body,raw,send一下会有返回消息,如图
咱们依次把2和3都存储进ElasticSearch
把postman从PUT模式改为HEAD模式,就能够查有没有数据了,例如咱们查3就显示 status:200ok 这就代表有数据,咱们查4就显示status:404 NotFound
把PUT改成Delete就是删除,我这里不演示
Get就是查询,不演示
更新也是PUT,PUT第一次就是插入,后面全是更新
把id换成_search就能够,例如:
好比我想查询,about是和音乐相关的,我能够这样写
http://193.112.28.104:9200/meizu/employee/_search?q=about:音乐
加了一个 ?q= 后面是属性名:查询关键字
看看结果:
上面的条件查询加的是?q=,这里使用条件表达式也是同样的效果。
使用POST方式,http://193.112.28.104:9200/meizu/employee/_search
而后使用Body里的raw,改成json数据,结果也是同样的。这个也是全文搜索,只要有这个关键字的其中一个,就会出现
{ "query":{ "match":{ "about":"音乐" } } }
这个不是模糊的了,必须是和关键字如出一辙才能查出来
{ "query":{ "match_phrase":{ "about":"音乐" } } }
{ "query":{ "match_phrase":{ "about":"音乐" } }, "highlight":{ "fields":{ "about":{} } } }
SpringBoot与ElasticSearch的交互有两种方式的,我把两种方式的Maven依赖都写出来,咱们两种方式都测试一下。
ElasticSearch的Jest版Maven引用
<dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.4</version> </dependency>
ElasticSearch的SpringBoot版Maven引用,不是ElasticSearch,在Maven仓库里面须要搜索
spring-boot-starter-data-elasticsearch
出现的第一个就是,这个是SpringBoot版的ElasticSearch,以下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.1.3.RELEASE</version> </dependency>
咱们看看org.springframework.boot.autoconfigure这个包,发现下面有两个ElasticSearch,一个是data.elasticsearch,一个是elasticsearch.jest,如图:
这两种方式都是能够的,Jest是经过Http的方式,data.ElasticSearch是SpringBoot data整合的,总结一下
SpringBoot和ElasticSearch交互的两种方式:
jest:默认不生效,须要导入一个io.searchbox.client.JestClient的包
SpringBoot Data:默认生效
把Jest的Maven依赖引入进项目
在application配置文件写上咱们的ElasticSearch部署服务器的ip
spring: elasticsearch: jest: uris: http://193.112.28.104:9200
Jest存入ElasticSearch
@Autowired JestClient jestClient; @Test public void jest(){ //第一步,先新建文档 Message message=new Message(); message.setId("1"); message.setCommand("音乐"); message.setDescription("音乐风格"); message.setContent("许嵩的音乐风格很是独特"); //第二步,新建一个索引 Index index=new Index.Builder(message).index("Vae").type("Music").build(); //第三步,执行 try { jestClient.execute(index); } catch (IOException e) { e.printStackTrace(); } }
咱们这里存储一个Message对象,注意,Message对象的Id须要加一个注解
public class Message { @JestId private String id; ....
执行一下,成功后在浏览器或者PostMan输入
照理说应该会出现咱们的Message对象的json数据,可是不知道为何个人没有出现....个人报了这个错误
{ "error": { "root_cause": [ { "type": "index_not_found_exception", "reason": "no such index", "resource.type": "index_expression", "resource.id": "Vae", "index_uuid": "_na_", "index": "Vae" } ], "type": "index_not_found_exception", "reason": "no such index", "resource.type": "index_expression", "resource.id": "Vae", "index_uuid": "_na_", "index": "Vae" }, "status": 404 }
我不知道为何,也搜不出来答案
Jest读取ElasticSearch
@Test public void jestsearch(){ String json="{\n" + " \"query\":{\n" + " \"match\":{\n" + " \"about\":\"音乐\"\n" + " }\n" + " }\n" + "}"; //构建搜索功能 Search search = new Search.Builder(json).addIndex("meizu").addType("employee").build(); //执行 try { SearchResult result=jestClient.execute(search); System.out.println(result.getJsonString()); } catch (IOException e) { e.printStackTrace(); } }
这个却是成功了,我查找以前存储的employee数据
咱们先引入SpringBoot data ElasticSearch的Maven依赖
配置文件
spring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 193.112.28.104:9300
新建一个Java Bean的类吧
package com.example.bean; import io.searchbox.annotations.JestId; public class Article { @JestId private Integer id; private String title; private String auter; private String content; public Article() { } public Article(Integer id, String title, String auter, String content) { this.id = id; this.title = title; this.auter = auter; this.content = content; } @Override public String toString() { return "Article{" + "id=" + id + ", title='" + title + '\'' + ", auter='" + auter + '\'' + ", content='" + content + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuter() { return auter; } public void setAuter(String auter) { this.auter = auter; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
再新建一个实现了ElasticsearchRepository接口的接口
package com.example.repository; import com.example.bean.Article; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import java.util.List; public interface ArticleRepository extends ElasticsearchRepository<Article,Integer> { public List<Article> findArticleContentLike(String Content); }
我本身写了一个自定义方法,模糊查询Content字段
@Test public void data1(){ Article article=new Article(); article.setId(1); article.setTitle("音乐"); article.setAuter("许嵩"); article.setContent("许嵩的音乐风格很独特"); articleRepository.index(article); } @Test public void data2(){ for (Article article : articleRepository.findArticleContentLike("许嵩")) { System.out.println(article); } }
一个是存储,一个是模糊查询,可是!!我仍是执行保存......个人好像也不是版本问题.....先搁置吧,忙着找工做,没时间解决这个报错