@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
<S extends T> S index(S var1);
Iterable<T> search(QueryBuilder var1);
Page<T> search(QueryBuilder var1, Pageable var2);
Page<T> search(SearchQuery var1);
Page<T> searchSimilar(T var1, String[] var2, Pageable var3);
void refresh();
Class<T> getEntityClass();
}java
咱们能够经过继承ElasticsearchRepository来完成基本的CRUD及分页操做。ElasticsearchRepository继承了ElasticsearchCrudRepository extends PagingAndSortingRepository.详细使用见。spring
ElasticsearchRepository里面有几个特殊的search方法,这些是ES特有的,和普通的JPA区别的地方,用来构建一些ES查询的。主要是看QueryBuilder和SearchQuery两个参数,要完成一些特殊查询就主要看构建这两个参数。api
(Query的继承关系图)elasticsearch
从这个关系中能够看到ES的search方法须要的参数SearchQuery是一个接口,有一个实现类叫NativeSearchQuery,实际使用中,咱们的主要任务就是构建NativeSearchQuery来完成一些复杂的查询的。工具
要构建NativeSearchQuery,主要是须要几个构造参数,大概包括QueryBuilder,filter,和排序的SortBuilder,和高亮的字段:ui
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts, Field[] highlightFields) {
this.query = query;
this.filter = filter;
this.sorts = sorts;
this.highlightFields = highlightFields;
}this
通常状况下,咱们不是直接是new NativeSearchQuery,而是使用NativeSearchQueryBuilder。spa
经过NativeSearchQueryBuilder.withQuery(QueryBuilder1).withFilter(QueryBuilder2).withSort(SortBuilder1).withXXXX().build();这样的方式来完成NativeSearchQuery的构建。.net
QueryBuilder主要用来构建查询条件、过滤条件,SortBuilder主要是构建排序。对象
要构建QueryBuilder,咱们能够使用工具类QueryBuilders,里面有大量的方法用来完成各类各样的QueryBuilder的构建,字符串的、Boolean型的、match的、地理范围的等等。
要构建SortBuilder,能够使用SortBuilders来完成各类排序。
而后就能够经过NativeSearchQueryBuilder来组合这些QueryBuilder和SortBuilder,再组合分页的参数等等,最终就能获得一个SearchQuery了。
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("spring boot OR 书籍")).build();
ElasticSearchTemplate更可能是对ESRepository的补充,里面提供了一些更底层的方法。ElasticsearchTemplate是Spring对ES的java api进行的封装,提供了大量的相关的类来完成各类各样的查询。
上面主要是一些查询操做,经过构建各类SearchQuery条件进行查询。
也能够完成add操做:
String documentId = "123456";
SampleEntity sampleEntity = new SampleEntity();
sampleEntity.setId(documentId);
sampleEntity.setMessage("some message");
IndexQuery indexQuery = new IndexQueryBuilder().withId(sampleEntity.getId()).withObject(sampleEntity).build();//构建这个对象,主要是设置一下id,就是你的对象的id,Object就是对象自己,indexName和type就是在你的对象javaBean上声明的
elasticsearchTemplate.index(indexQuery);//add主要是经过index方法来完成,须要构建一个IndexQuery对象
template里还有各类deleteIndex,delete,update等方法。