Elasticsearch学习(7)—— 查询API

1. ElasticSearchRepository的基本使用

@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,而是使用NativeSearchQueryBuilderspa

经过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();

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

相关文章
相关标签/搜索