1.SpringDataES环境搭建
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API
进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域
为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
1.1 环境搭建
步骤一:Spring-Data-ElasticSearch,Spring-test帮助你加载配置文件并且测试
ESTemplate模板,模板当中包含了一系列的方法
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>3.1.9.RELEASE</version> <exclusions> <exclusion> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport‐netty4‐client</artifactId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.5.RELEASE</version> <scope>test</scope> </dependency>
步骤二:创建Spring的核心配置文件
<!--开启包扫描--> <context:component-scan base-package="com.wdksoft"/> <!--配置集群信息--> <elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch" cluster-nodes="127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302"/> <!--注入ESTemplate模板--> <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"> <constructor-arg name="client" ref="esClient"/> </bean>
2.SpringDataES案例
2.1 添加索引库
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class SpringDataESTest { //植入模板对象 @Resource private ElasticsearchTemplate elasticsearchTemplate; @Test public void createIndex(){ //创建空的索引库 elasticsearchTemplate.createIndex(Hello.class); } }
2.2 添加索引库并且指定Mapping信息
利用POJO映射Mapping信息
@Document(indexName = "my-index",type = "hello") public class Hello { @Id @Field(type = FieldType.Long,index = false,store = true) private Long id; @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word") private String title; @Field(type = FieldType.Text,index = true,store = true,analyzer = "ik_max_word") private String content; } @Test public void createIndex(){ //创建空的索引库 elasticsearchTemplate.+(Hello.class); elasticsearchTemplate.putMapping(Hello.class); }
2.3 添加文档数据
创建Mapper层接口:
/** * 数据访问层接口 */ @Repository public interface HelloMapper extends ElasticsearchRepository<Hello,Long> { } 创建Service层接口 public interface HelloService { public void save(Hello hello); } 创建Service层接口实现类 @Service("helloService") public class HelloServiceImpl implements HelloService { //植入Mapper层对象 @Resource private HelloMapper helloMapper; @Override public void save(Hello hello) { helloMapper.save(hello); } } 测试: /** * 添加文档数据 */ @Test public void createDocument(){ Hello hello=new Hello(); hello.setId(1l); hello.setTitle("新增的Title数据"); hello.setContent("新增的Content数据"); helloService.save(hello); }
2.4 删除文档数据
Service层接口
//根据文档ID删除 public void deleteById(long id); //删除全部 public void deleteAll(); Service层接口实现类 @Override public void deleteById(long id) { helloMapper.deleteById(id); } @Override public void deleteAll() { helloMapper.deleteAll(); }
测试:
/** * 删除文档数据 */ @Test public void deleteDocument(){ //根据文档ID删除 helloService.deleteById(1l); //全部删除 helloService.deleteAll(); }
2.5 修改文档数据
/** * 修改文档数据:先删除再修改,调用的还是save方法 */ @Test public void updateDocument(){ Hello hello=new Hello(); hello.setId(1l); hello.setTitle("[修改]新增的Title数据"); hello.setContent("[修改]新增的Content数据"); helloService.save(hello); }
2.6 根据ID查询
Service层接口
//根据文档ID查询数据 public Optional<Hello> findById(Long id); Service层接口实现类 @Override public Optional<Hello> findById(Long id) { return helloMapper.findById(id); } 测试: /** * 根据文档ID查询 */ @Test public void getDocumentById(){ Optional<Hello> optional = helloService.findById(2l); Hello hello = optional.get(); System.out.println(hello); }
2.7 查询全部文档数据
Service层接口
//查询所有数据 public Iterable<Hello> findAll(); //查询所有数据包含分页 public Page<Hello> findAll(Pageable pageable); Service层接口实现类 @Override public Iterable<Hello> findAll() { return helloMapper.findAll(); } @Override public Page<Hello> findAll(Pageable pageable) { return helloMapper.findAll(pageable); }
测试:
/** * 查询所有文档数据 */ @Test public void getAllDocument(){ Iterable<Hello> iterable = helloService.findAll(); iterable.forEach(item-> System.out.println(item)); } /** * 查询所有文档数据加分页 */ @Test public void getDocumentPage(){ //指定分页规则 Page<Hello> page = helloService.findAll(PageRequest.of(0, 5)); for (Hello hello:page.getContent()) { System.out.println(hello); } }
2.8 根据查询方法的自定义规则进行数据查询
根据Title域进行查询,并且加分页
Mapper层接口:
/** * 数据访问层接口 */ @Repository public interface HelloMapper extends ElasticsearchRepository<Hello,Long> { //根据Title域中的关键词查找数据 public List<Hello> findByTitle(String str); //根据Title域中的关键词查找数据 public List<Hello> findByTitle(String str, Pageable pageable); } Service层接口 //根据Title域中的关键词查找数据 public List<Hello> findByTitle(String str); //根据Title域中的关键词查找数据 public List<Hello> findByTitle(String str, Pageable pageable); Service层接口实现类 @Override public List<Hello> findByTitle(String str) { return helloMapper.findByTitle(str); } @Override public List<Hello> findByTitle(String str, Pageable pageable) { return helloMapper.findByTitle(str,pageable); }
测试:
/** * 查询所有文档数据加分页 */ @Test public void getDocumentByTitle(){ /*List<Hello> helloLists = helloService.findByTitle("修改"); helloLists.stream().forEach(item-> System.out.println(item));*/ List<Hello> helloLists = helloService.findByTitle("新增", PageRequest.of(0, 5)); helloLists.stream().forEach(item-> System.out.println(item)); }
2.9 NativeSearchQuery
/** * 根据一段内容查询数据:NativeSearchQuery */ @Test public void getDocumentQuery(){ //创建NativeSearchQueryBuilder对象 NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); //指定查询规则 NativeSearchQuery build = nativeSearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery("搜索新增").defaultField("title")) .withPageable(PageRequest.of(0,5)).build(); //使用ESTemplates执行查询 List<Hello> hellos = elasticsearchTemplate.queryForList(build, Hello.class); hellos.stream().forEach(item-> System.out.println(item)); }