@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等方法。