美文网首页
Spring Data ElasticSearch 初识

Spring Data ElasticSearch 初识

作者: 云师兄 | 来源:发表于2018-06-29 16:40 被阅读169次

    ElasticSearchRepository和ElasticSearchTemplate的区别

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

    ElasticSearchRepository

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

    @NoRepositoryBean
    public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
    
        <S extends T> S index(S entity);
    
        Iterable<T> search(QueryBuilder query);
    
        Page<T> search(QueryBuilder query, Pageable pageable);
    
        Page<T> search(SearchQuery searchQuery);
    
        Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);
    
        void refresh();
    
        Class<T> getEntityClass();
    }
    

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


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

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

    public NativeSearchQuery(QueryBuilder query, QueryBuilder filter, List<SortBuilder> 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<IndexQuery> queries) {
            BulkRequestBuilder bulkRequest = client.prepareBulk();
            for (IndexQuery query : queries) {
                bulkRequest.add(prepareIndex(query));
            }
            BulkResponse bulkResponse = bulkRequest.execute().actionGet();
            if (bulkResponse.hasFailures()) {
                Map<String, String> failedDocuments = new HashMap<String, String>();
                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<IndexQuery>仅此而已。

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

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

    参考文档

    相关文章

      网友评论

          本文标题:Spring Data ElasticSearch 初识

          本文链接:https://www.haomeiwen.com/subject/lmbayftx.html