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

相關文章
相關標籤/搜索