Spring Data ElasticSearch 初识

ElasticSearchRepository和ElasticSearchTemplate的区别

JPA中有个ElasticsearchRepository可以做Elasticsearch的相关增删改查,用法和普通的CRUDRepository是一样的,这样就能统一ElasticSearch和普通的JPA操作,获得和操作mysql一样的代码体验。但是同时可以看到ElasticsearchRepository的功能是比较少的,简单查询够用,但复杂查询就不够了。而ElasticsearchTemplate则提供了更多的方法来完成更多的功能,也包括分页之类的,他其实就是一个封装好的ElasticSearch Util功能类,通过直接连接client来完成数据的操作。

ElasticSearchRepository

特殊情况下,ElasticsearchRepository里面有几个特殊的search方法,这些是ES特有的,和普通的JPA区别的地方,用来构建一些ES查询的。这个接口的代码如下:

@NoRepositoryBean
public interface ElasticsearchRepository extends ElasticsearchCrudRepository {

     S index(S entity);

    Iterable search(QueryBuilder query);

    Page search(QueryBuilder query, Pageable pageable);

    Page search(SearchQuery searchQuery);

    Page searchSimilar(T entity, String[] fields, Pageable pageable);

    void refresh();

    Class getEntityClass();
}

主要是看QueryBuilder和SearchQuery两个参数,要完成一些特殊查询就主要看构建这两个参数。
我们先来看看它们之间的类关系:


屏幕快照 2018-07-02 上午8.30.55.png

从这个关系中可以看到ES的search方法需要的参数SearchQuery是一个接口,有一个实现类叫NativeSearchQuery,实际使用中,我们的主要任务就是构建NativeSearchQuery来完成一些复杂的查询的。这个类的构造函数如下:

public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List sorts, HighlightBuilder.Field[] highlightFields) {
        this.query = query;
        this.filter = filter;
        this.sorts = sorts;
        this.highlightFields = highlightFields;
    }

可以看出来,大概是需要QueryBuilder,filter,和排序的SortBuilder,和高亮的字段。
一般情况下,我们不是直接是new NativeSearchQuery,而是使用NativeSearchQueryBuilder。
通过NativeSearchQueryBuilder.withQuery(QueryBuilder1).withFilter(QueryBuilder2).withSort(SortBuilder1).withXXXX().build();这样的方式来完成NativeSearchQuery的构建。
QueryBuilder和SortBuilder这两个接口的实现类图如下:


屏幕快照 2018-07-02 上午8.42.44.png

从名字就能看出来,QueryBuilder主要用来构建查询条件、过滤条件,SortBuilder主要是构建排序。

要构建QueryBuilder,我们可以使用工具类QueryBuilders,里面有大量的方法用来完成各种各样的QueryBuilder的构建,字符串的、Boolean型的、match的、地理范围的等等。
要构建SortBuilder,可以使用SortBuilders来完成各种排序。
然后就可以通过NativeSearchQueryBuilder来组合这些QueryBuilder和SortBuilder,再组合分页的参数等等,最终就能得到一个SearchQuery了。

ElasticSearchTemplate的使用

ElasticSearchTemplate更多是对ESRepository的补充,里面提供了一些更底层的方法,主要是一些查询相关的,同样是构建各种SearchQuery条件。另外它也可以完成add操作,add主要是通过index方法来完成,需要传入一个IndexQuery对象,这个类中的字段有如下:

package org.springframework.data.elasticsearch.core.query;

public class IndexQuery {

    private String id;
    private Object object;
    private Long version;
    private String indexName;
    private String type;
    private String source;
    private String parentId;
......
}

构建这个对象,主要是设置一下id,就是对象的id,Object就是对象本身,indexName和type就是在对象javaBean上声明的elasticsearch的index和type。构建完IndexQuery后就可以通过Template的index方法插入了。
下面讲一个批量插入的方法,ES提供了批量插入数据的功能——bulk。前面讲过JPA的save方法也可以save(List)批量插值,但适用于小数据量,要完成超大数据的插入就要用ES自带的bulk了,可以迅速插入百万级的数据,在ElasticSearchTemplate里也提供了对应的方法,代码如下:

@Override
    public void bulkIndex(List queries) {
        BulkRequestBuilder bulkRequest = client.prepareBulk();
        for (IndexQuery query : queries) {
            bulkRequest.add(prepareIndex(query));
        }
        BulkResponse bulkResponse = bulkRequest.execute().actionGet();
        if (bulkResponse.hasFailures()) {
            Map failedDocuments = new HashMap();
            for (BulkItemResponse item : bulkResponse.getItems()) {
                if (item.isFailed())
                    failedDocuments.put(item.getId(), item.getFailureMessage());
            }
            throw new ElasticsearchException(
                    "Bulk indexing has failures. Use ElasticsearchException.getFailedDocuments() for detailed messages ["
                            + failedDocuments + "]", failedDocuments
            );
        }
    }

和index插入单条数据一样,这里需要的是List仅此而已。

使用kibana来进行ElasticSearch的信息查询检索

大家经常会听到使用ELK搭建日志管理平台、完成日志聚合检索的功能,ELK包括ElasticSearch(数据存储、快速查询)、logstash(日志搜集)、kibana(展示ElasticSearch数据的图形界面)。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了ES的可视化操作管理器,它与logstash是没有任何关系的,完全可以单独使用,logstash相当于一个日志中转站,通过接收客户端发送来的日志,然后把日志存储到ES中。

参考文档

  • https://blog.csdn.net/tianyaleixiaowu/article/details/72843192 这个博主写的es系列文档挺清楚。

你可能感兴趣的:(Spring Data ElasticSearch 初识)