2019独角兽企业重金招聘Python工程师标准>>>
1. ElasticSearchRepository的基本使用
@NoRepositoryBean
public interface ElasticsearchRepositoryextends ElasticsearchCrudRepository {
S index(S var1);
Iterablesearch(QueryBuilder var1);
Pagesearch(QueryBuilder var1, Pageable var2);
Pagesearch(SearchQuery var1);
PagesearchSimilar(T var1, String[] var2, Pageable var3);
void refresh();
ClassgetEntityClass();
}
我们可以通过继承ElasticsearchRepository来完成基本的CRUD及分页操作。ElasticsearchRepository继承了ElasticsearchCrudRepository extends PagingAndSortingRepository.详细使用见。
ElasticsearchRepository里面有几个特殊的search方法,这些是ES特有的,和普通的JPA区别的地方,用来构建一些ES查询的。主要是看QueryBuilder和SearchQuery两个参数,要完成一些特殊查询就主要看构建这两个参数。
从这个关系中可以看到ES的search方法需要的参数SearchQuery是一个接口,有一个实现类叫NativeSearchQuery,实际使用中,我们的主要任务就是构建NativeSearchQuery来完成一些复杂的查询的。
要构建NativeSearchQuery,主要是需要几个构造参数,大概包括QueryBuilder,filter,和排序的SortBuilder,和高亮的字段:
public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> sorts, Field[] highlightFields) {
this.query = query;
this.filter = filter;
this.sorts = sorts;
this.highlightFields = highlightFields;
}
一般情况下,我们不是直接是new NativeSearchQuery,而是使用NativeSearchQueryBuilder。
通过NativeSearchQueryBuilder.withQuery(QueryBuilder1).withFilter(QueryBuilder2).withSort(SortBuilder1).withXXXX().build();这样的方式来完成NativeSearchQuery的构建。
QueryBuilder主要用来构建查询条件、过滤条件,SortBuilder主要是构建排序。
要构建QueryBuilder,我们可以使用工具类QueryBuilders,里面有大量的方法用来完成各种各样的QueryBuilder的构建,字符串的、Boolean型的、match的、地理范围的等等。
要构建SortBuilder,可以使用SortBuilders来完成各种排序。
然后就可以通过NativeSearchQueryBuilder来组合这些QueryBuilder和SortBuilder,再组合分页的参数等等,最终就能得到一个SearchQuery了。
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("spring boot OR 书籍")).build();
2.ElasticSearchTemplate的使用
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等方法。