Docker Hub 镜像下载地址:https://hub.docker.com/
docker pull elasticsearch:7.6.2
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 elasticsearch:7.6.2
注意:根据自己情况来配置 ==-e ES_JAVA_OPTS=”-Xms256m -Xmx256m”== 不配置的话,启动会占用你的 2G 内存,反之,配置的话,启动则根据你配置的内存来分配。
异常:如果启动后,docker 容器自动关闭,且无法访问
docker logs -f id[容器id] // 查看启动日志
// 修改 elasticsearch.yml 配置即可解决
// 先查找 elasticsearch.yml
find / -name elasticsearch.yml
vim elasticsearch.yml 路径
// 在elasticsearch.yml添加下面内容
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]
sysctl -w vm.max_map_count=262144
//重新启动容器
docker start 容器[id]
简单示例演示:使用工具: Postman
发送成功:
注意:如果 put 出现 503 错误,需要在配置elasticsearch.yml文件中添加
node.name: node-1
查询:
springBoot 2.3.0 版本及以后版本不支持 es 查询工具 jestClient 自动注入
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
spring.elasticsearch.jest.uris=http://192.168.64.129:9200
public class Article {
@JestId
private Integer id;
private String author;
private String title;
private String content;
// get、set省略。。。。
}
@Autowired
private JestClient jestClient;
@Test
void contextLoads() {
Article article = new Article();
article.setId(1);
article.setTitle("三国演义");
article.setAuthor("罗贯中");
article.setContent("Hello World");
Object source;
Index index = new Index.Builder(article).index("sanguo").type("news").build();
try {
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
由于 springboot 2.3.0 以后版本不支持自动注入 JestClient,如下图我们在 yml 文件中配置 JestClient 时会出现划掉的线提示。我们采取手动配置的方式
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>6.3.1</version>
</dependency>
public class Article {
@JestId
private Integer id;
private String author;
private String title;
private String content;
// get、set省略。。。。
}
【jestClient.java】
@Repository
public class jestClient {
public JestClient getJestCline(){
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig
.Builder("http://192.168.64.129:9200")
.multiThreaded(true)
.build());
return factory.getObject();
}
}
@Test
void contextLoads() {
Article article = new Article();
article.setId(1);
article.setTitle("西游记");
article.setAuthor("吴承恩");
article.setContent("Hello World");
Index index = new Index.Builder(article).index("xiyou").type("news").build();
try {
jestClient.getJestCline().execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}
更多操作:https://github.com/searchbox-io/Jest/tree/master/jest
// 测试搜索
@Test
public void search(){
// 查询表达式
String json ="{\n" +
" \"query\" : {\n" +
" \"match\" : {\n" +
" \"content\" : \"hello\"\n" +
" }\n" +
" }\n" +
"}";
// 构建搜索功能
Search search = new Search.Builder(json).addIndex("xiyou").addType("news").build();
// 执行
try {
// 2.2 版本: SearchResult result = jestClient.execute(search);
// 以下是2.3版本
SearchResult result = jestClient.getJestCline().execute(search);
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=118.24.44.169:9301
其他的不过多的赘述了,不在向上面分版本,其他的参考 2.3 版本,可自行百度。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
版本适配说明:https://github.com/spring-projects/spring-data-elasticsearch
如果版本不适配:
1)、升级 SpringBoot 版本
2)、安装对应版本的 ES
现在 spring 官方推荐我们用
High Level REST Client
来配置
手动配置如下:
@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration configuration = ClientConfiguration.builder(
)
.connectedTo("192.168.64.129:9200")
//.withConnectTimeout(Duration.ofSeconds(5))
//.withSocketTimeout(Duration.ofSeconds(3))
//.useSsl()
//.withDefaultHeaders(defaultHeaders)
//.withBasicAuth(username, password)
// ... other options
.build();
RestHighLevelClient client = RestClients.create(configuration).rest();
return client;
}
}
//6.0版本后,一个index只有一个type了,这里type也被移除。ES默认type为“_doc”
@Document(indexName = "at")
public class Book {
private Integer id;
private String bookname;
private String author;
//get set 构造函数,toString的得写上,这里太长就删了先
}
Elasticsearch Repositories
先用Elasticsearch Repositories
,注意接口与接口的关系是 extends
@Repository
public interface Bookrepository extends ElasticsearchRepository<Book,Integer> {
//ElasticsearchCrudRepository 已经过时
List<Book> findBookById(int i);
}
Elasticsearch Repositories
提供了许多关键字,来帮助我们实现方法。我们只需要写抽象方法即可,Elasticsearch Repositories
会根据方法名自动我们为我们实现,比如上面find
和By
就是关键字。我们需要在 springboot 主配置类上加上注解@EnableElasticsearchRepositories
可以使用 Elasticsearch 提供的的关键字(方法)列表,常用关键字如下
然后测试一下
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
Bookrepository bookrepository;
@Test
void contextLoads() {
Book book=new Book(1,"西游记","吴承恩");
bookrepository.save(book);
}
@Test
void testRepositories(){
//查询
//Elasticsearch Repositories提供and,by等一大堆关键字来连接JAVABEAN属性,我们写接口,他自动变成为实现类。
List<Book> bookById = bookrepository.findBookById(1);
System.out.println(bookById.get(0));
}
}
结果
Elasticsearch Operations
ElasticsearchTemplate 是基于Transport client
的,Transport client
将会再 ES8.0 中被弃用,用谁不用我多说了吧。
使用 Elasticsearch Operations 我们需要修改上面的配置类,需要继承AbstractElasticsearchConfiguration
,因为基类AbstractElasticsearchConfiguration
已经提供了ElasticsearchRestTemplate
这个bean
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration configuration = ClientConfiguration.builder(
)
.connectedTo("192.168.100.126:9200")//9300会报错
//.withConnectTimeout(Duration.ofSeconds(5))
//.withSocketTimeout(Duration.ofSeconds(3))
//.useSsl()
//.withDefaultHeaders(defaultHeaders)
//.withBasicAuth(username, password)
// ... other options
.build();
RestHighLevelClient client = RestClients.create(configuration).rest();
return client;
}
}
使用方法
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
ElasticsearchOperations elasticsearchOperations;
@Test
void testSaveByOperations(){
Book book=new Book(2,"西游记2","吴承恩二世");
IndexQuery indexQuery= new IndexQueryBuilder()
.withId(book.getId().toString())
.withObject(book)
.build();
String documentId = elasticsearchOperations.index(indexQuery, IndexCoordinates.of("at"));//返回_id(并非javabean中的ID,而是hits中的)
System.out.println(documentId);
}
@Test
void testFindByOperations(){
Book book = elasticsearchOperations.get("2",Book.class,IndexCoordinates.of("at"));//IndexCoordinates的参数为Index
System.out.println(book);
}
}
结果