spring-data-elasticsearch + java 查询方法的封装
来源:互联网 发布:nginx 点播回看 编辑:程序博客网 时间:2024/06/05 06:19
最近开始重构elasicsearch+springboot+spring data elasticsearch的东西
由于近期更新了elasticsearch 5.x /6.x,大家都忙着尝鲜,不过其中整合框架的过程中遇到了很多的问题
- 在复写项目的过程中,有重新温习了一下spring data elasticsearch 的操作,我当前尝试的是spring-data-elasticsearch 3.0.1.RELEASE版本,比对以前的一些操作修改的不多,就是一些save=>saveAll,findOne=>findById,findAll=>findAllByIds等等,底层的操作原理没有影响,如果会的同志应当不会太困扰
- 后期还会对transportClient的使用和框架整合ES的searchquery的介绍
以下是旧版本的spring-data-elasticsearch +java的操作:
1、封装数据库基本CRUD(创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete))
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { <S extends T> S save(S entity); T findOne(ID primaryKey); Iterable<T> findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); // … more functionality omitted.}
2、分页排序查询
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable);}//Accessing the second page by a page size of 20PagingAndSortingRepository<User, Long> repository = // … get access to a beanPage<User> users = repository.findAll(new PageRequest(1, 20));
3、计数
public interface UserRepository extends CrudRepository<User, Long> { Long countByLastname(String lastname);}
4、删除
public interface UserRepository extends CrudRepository<User, Long> { Long deleteByLastname(String lastname); List<User> removeByLastname(String lastname);}
5、自定义查询方法自动注入
声明一个接口继承Repository
interface PersonRepository extends Repository<Person, Long> {List<Person> findByLastname(String lastname);}
保证注入了elasticsearch配置
在bootstrap.yml中写入了spring-data-elasticsearch的配置文件将自动注入
注入调用
public class SomeClient { @Autowired private PersonRepository repository; public void doSomething() { List<Person> persons = repository.findByLastname("Matthews"); }}
6、支持Java8 Stream查询和sql语句查询
@Query("select u from User u")Stream<User> findAllByCustomQueryAndStream();Stream<User> readAllByFirstnameNotNull();@Query("select u from User u")Stream<User> streamAllPaged(Pageable pageable);try (Stream<User> stream = repository.findAllByCustomQueryAndStream()) { stream.forEach(…);}
7、支持异步查询
@AsyncFuture<User> findByFirstname(String firstname); @AsyncCompletableFuture<User> findOneByFirstname(String firstname);@AsyncListenableFuture<User> findOneByLastname(String lastname);
支持原生es JavaAPI
1、NativeSearchQueryBuilder构建查询
@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(matchAllQuery()) .withFilter(boolFilter().must(termFilter("id", documentId))) .build();Page<SampleEntity> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery,SampleEntity.class);
2、利用Scan和Scroll进行大结果集查询
SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(matchAllQuery()) .withIndices("test-index") .withTypes("test-type") .withPageable(new PageRequest(0,1)) .build();String scrollId = elasticsearchTemplate.scan(searchQuery,1000,false);List<SampleEntity> sampleEntities = new ArrayList<SampleEntity>();boolean hasRecords = true;while (hasRecords){ Page<SampleEntity> page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultsMapper<SampleEntity>() { @Override public Page<SampleEntity> mapResults(SearchResponse response) { List<SampleEntity> chunk = new ArrayList<SampleEntity>(); for(SearchHit searchHit : response.getHits()){ if(response.getHits().getHits().length <= 0) { return null; } SampleEntity user = new SampleEntity(); user.setId(searchHit.getId()); user.setMessage((String)searchHit.getSource().get("message")); chunk.add(user); } return new PageImpl<SampleEntity>(chunk); } }); if(page != null) { sampleEntities.addAll(page.getContent()); hasRecords = page.hasNextPage(); } else{ hasRecords = false; } }}
3、获取client实例进行节点操作,可以自行封装Util方法
@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;public void searchHelper() throws IOException { //节点客户端 // on startup// Node node = nodeBuilder().clusterName("syncwt-es").client(true).node();// Client nodeClient = node.client(); //传输客户端// Settings settings = Settings.settingsBuilder().build();// Client transportClient = TransportClient.builder().settings(settings).build(); Client transportClient = elasticsearchTemplate.getClient(); Customer customer = new Customer("Alice", "Smith"); // instance a json mapper ObjectMapper mapper = new ObjectMapper(); // create once, reuse // generate json String json = mapper.writeValueAsString(customer); System.out.println("--------------------------------jackson mapper"); System.out.println(json); XContentBuilder builder = jsonBuilder() .startObject() .field("firstName", "Alice") .field("latName", "Smith") .endObject(); System.out.println("--------------------------------jsonBuilder"); System.out.println(builder.string()); IndexResponse response = transportClient.prepareIndex("es-customer", "customer") .setSource(jsonBuilder() .startObject() .field("firstName", "Alice") .field("latName", "Smith") .endObject() ) .execute() .actionGet(); System.out.println("--------------------------------response"); System.out.println(response.toString()); // on shutdown// node.close();// nodeClient.close(); transportClient.close(); }
阅读全文
0 0
- spring-data-elasticsearch + java 查询方法的封装
- spring data jpa的动态查询封装
- spring data elasticsearch的一个复杂查询条件
- Spring-data-JPA查询方法的总结
- Spring Data Elasticsearch
- spring-data-elasticsearch api
- Spring Data ElasticSearch
- 深入浅出 spring-data-elasticsearch
- spring data elasticsearch
- Spring Data Elasticsearch翻译
- Spring Data Elasticsearch
- Spring Data Elasticsearch
- Spring data jpa查询多个部分字段的方法
- Spring Data学习笔记-查询方法
- Spring Data JPA 简单查询--接口方法
- spring data jpa specification的封装
- spring-data-mongo BaseDao的封装
- ElasticSearch java API 封装
- mysql数据库主从复制
- Android开发&可折叠的布局——CollapseLayout
- spring cloud config bug
- 鹧鸪天
- C语言实现单链表的创建、插入、删除
- spring-data-elasticsearch + java 查询方法的封装
- table的一些设置
- JavaScript11种刷新的方法
- iOS原生实现二维码扫描
- C#调用打印机,打印图片
- Web车牌识别中API接口的调用
- Http Header里的Content-Type
- linux服务器出现大量TIME_WAIT的解决方法
- element traversal