准备环境:参考 https://blog.csdn.net/weixin_44141284/article/details/121553749
修改ES解压目录/config/elasticsearch.yml文件,防止cors,末尾需要添加
http.cors.enabled: true http.cors.allow-origin: "*"
1. springboot pom.xml
org.springframework.boot spring-boot-starter-parent2.2.2.RELEASE org.springframework.boot spring-boot-starter-weborg.projectlombok lomboktrue org.springframework.boot spring-boot-starter-testtest junit junitcom.alibaba fastjson1.2.60 com.google.guava guava21.0 org.apache.commons commons-lang33.9 org.springframework.boot spring-boot-starter-data-elasticsearch2.3.12.RELEASE
2. application.yml配置
server:
port: 9090
spring:
data:
elasticsearch:
client:
reactive:
endpoints: localhost:9200
3. elasticsearch 配置类
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
@Configuration
public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration {
@Value("${spring.data.elasticsearch.client.reactive.endpoints}")
private String clusterNodes;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(clusterNodes)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
4.实体类
package com.space.es.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "product", shards = 3, replicas = 0)
public class ProductEntity implements Serializable {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String code;
@Field(type = FieldType.Text, analyzer = "simple")
private String pdName;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private BigDecimal price;
// @Field(type = FieldType.Text, analyzer = "ik_max_word")
@Field(type = FieldType.Text, index = false)
private String descrip;
}
5.dao接口
import com.es.entity.ProductEntity; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @Repository public interface ProductRepository extends ElasticsearchRepository{ }
6.测试类
package com.space.es.main;
import com.google.common.collect.Lists;
import com.es.entity.ProductEntity;
import com.es.repository.ProductRepository;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@SpringBootTest
@RunWith(SpringRunner.class)
public class IndexAndDocTest {
@Autowired
private ProductRepository productRepository;
@Test
public void createIndex(){
System.out.println("项目启动时自动创建索引:index-----");
}
@Test
public void delIndex(){
boolean b = template.deleteIndex(ProductEntity.class);
System.out.println("del index: " + b);
}
@Test
public void save(){
ProductEntity entity = new ProductEntity();
entity.setId(1001L);
entity.setCode("Fruits");
entity.setCategory("水果");
entity.setPdName("香蕉");
entity.setPrice(new BigDecimal("3.5"));
entity.setAddressUrl("url");
productRepository.save(entity);
}
@Test
public void update(){
ProductEntity entity = new ProductEntity();
entity.setId(1002L);
entity.setCode("Fruits");
entity.setCategory("水果");
entity.setPdName("苹果");
entity.setPrice(new BigDecimal("6.5"));
entity.setAddressUrl("url");
productRepository.save(entity);
}
@Test
public void getByIdAndUpdate(){
Optional byId = productRepository.findById(1001L);
if (byId.isPresent()) {
System.out.println(byId.get());
ProductEntity entity = byId.get();
entity.setPrice(new BigDecimal("9.9"));
productRepository.save(entity);
}
}
@Test
public void findAll(){
Iterable all = productRepository.findAll();
for (ProductEntity entity : all) {
System.out.println(entity);
}
}
@Test
public void deleteDoc(){
Optional byId = productRepository.findById(1001L);
if (byId.isPresent()) {
System.out.println(byId.get());
productRepository.delete(byId.get());
}
}
@Test
public void saveAll(){
int count = 10;
for (int i = 0; i < count; i++) {
ProductEntity entity = new ProductEntity();
entity.setId((10L+i));
entity.setCategory("水果");
entity.setCode("Fruits");
entity.setPdName("山竹"+i);
entity.setPrice(new BigDecimal(i+1));
productRepository.save(entity);
}
}
@Test
public void findByPage(){
Sort sort = Sort.by(Sort.Direction.DESC, "id");
int from = 0;
int size = 5;
PageRequest pageRequest = PageRequest.of(from, size, sort);
Iterable all = productRepository.findAll(pageRequest);
for (ProductEntity entity : all) {
System.out.println(entity);
}
}
@Test
public void searchQuery(){
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "Fruits");
Iterable search = productRepository.search(termQueryBuilder);
for (ProductEntity entity : search) {
System.out.println(entity);
}
}
}



