Springboot整合ElasticSearch
记录下springboot操作ElasticSearch的一些基本使用实例
文章目录
前言
亲身经历,使用前一定要按照版本对应关系使用,否则会出现各种问题。。。
亲身经历,使用前一定要按照版本对应关系使用,否则会出现各种问题。。。
一、新建项目导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
二、修改配置文件
下面有两种配置方法都可以,任选一种
1. 方法一使用默认配置类
在application.properties 配置中加入es服务地址
spring.elasticsearch.uris= ip地址:端口号
2.方法二自定义配置
在application.properties 配置中加入es服务信息
elasticsearch.host=ip地址
elasticsearch.port=端口号
新建配置类
@Configuration
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
private String host;
private Integer port;
@Override
public RestHighLevelClient elasticsearchClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost(host,port)));
}
}
三、Es 基本使用
创建实体
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "product") // 指定索引名称,默认会启动时自动创建
@Setting(shards = 1,replicas = 1) // shards 分片数 replicas 副本数
public class Product {
@Id // 应用于字段级别以标记用于标识目的的字段。
private Long id;
@Field(type = FieldType.Text)
private String title;
@Field(type = FieldType.Keyword)
private String category;
@Field(type = FieldType.Double)
private Double price;
@Field(type = FieldType.Keyword,index = false)
private String images;
}
常见的FieldType类型及作用
//表示该字段是一个文本,并作最大程度拆分,默认建立索引
// analyzer 是指定分词器
@Field(type=FieldType.Text, analyzer="ik_max_word")
//表示该字段是一个文本,index为false表示不建立索引,默认是true
@Field(type=FieldType.Text,index=false)
// 表示该字段是一个长整型,默认建立索引
@Field(type=FieldType.Long)
// 表示该字段内容是一个文本并作为一个整体,不进行分词,直接索引
@Field(type=FieldType.Keyword)
创建Dao层
import com.es.eslearning.model.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductRepository extends ElasticsearchRepository<Product, Long> {
}
方法调用
创建测试类
@RunWith(SpringRunner.class)
@SpringBootTest
class EsLearningApplicationTests {
@Autowired
ProductRepository productRepository;
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void createEsIndex(){
// 默认启动就会创建
System.out.println("创建索引");
}
// 删除索引
@Test
public void delEsIndex(){
elasticsearchRestTemplate.indexOps(Product.class).delete();
}
/**
* 添加/修改 数据 id 相同执行修改,否则新增
*/
@Test
public void saveOrUpdateEs(){
Product product = new Product();
product.setTitle("Java书籍");
product.setId(1L);
product.setCategory("book");
product.setImages("test.jpg");
product.setPrice(100.00);
productRepository.save(product);
// 批量新增
productRepository.saveAll(Arrays.asList(product));
}
/**
* 查询数据
*/
@Test
public void queryEs(){
// 查询所有
Iterable<Product> all = productRepository.findAll();
// 根据id查询
Optional<Product> byId = productRepository.findById(1L);
// 分页查询 + 排序
// 排序第一种写法
Sort sort = Sort.by(Sort.Direction.DESC, "id");
//排序第二种写法
// Sort.sort(Product.class).by(Product::getId).ascending();
PageRequest request = PageRequest.of(0, 10,sort);
productRepository.findAll(request);
// 条件查询
Criteria criteria = new Criteria("title").is("Java书籍");
CriteriaQuery query = new CriteriaQuery(criteria);
elasticsearchRestTemplate.search(query,Product.class);
}
}
总结
上面都是一些es的基本使用情况,更多方法推荐查看上面的官方版本文档中的api信息,有详细的描述。