spring data elasticsearch增删改查

  1. 定义索引
package me.david;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
public enum EsIndex {
    INDEX_INTELLIGENT("intelligent_index"),
    @Getter
    private String name;
}
  1. 定义entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CollectLabel {
    private String id;
    private String labelId;
    private String email;
    private String label;
    private String createAt;
    private String updateAt;
}
  1. 定义es entity ,注解写明es的索引名和type名
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "index_name", type = "type_name")
public class EntityCollectLabel {

/**
*  查询的时候这个id是查到的es中_id的值,而非定义的id字段,但是插入的时候该id变量的值会插在es中的id字段
*/
    @Id
    private String id;

    @Field(type = FieldType.String)
    private String tagId;

    @Field(type = FieldType.String)
    private String tag;

    @Field(type = FieldType.String)
    private String email;

    @Field(type = FieldType.Date)
    private String createAt;

    @Field(type = FieldType.Date)
    private String updateAt;

}
  1. es增删改查类
package me.handler;

import com.alibaba.fastjson.JSON;
***//省略若干引用
import org.apache.logging.log4j.core.util.JsonUtils;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.DeleteQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.stereotype.Component;
import org.testng.collections.Lists;

import java.util.List;
import java.util.UUID;
import static org.elasticsearch.index.query.QueryBuilders.*;

@Component
@Slf4j
public class CollectLabelHandler extends BaseHandler {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    public void save(CollectLabel collectLabel){
        EntityCollectLabel ecl = new EntityCollectLabel();
        String date = DateTime.now().toString("yyyy-MM-dd HH:mm:ss");
        ecl.setCreateAt(date);
        ecl.setUpdateAt(date);
        ecl.setEmail(collectLabel.getEmail());
        ecl.setTag(collectLabel.getLabel());
        ecl.setTagId(UUID.randomUUID().toString());
        IndexQuery query = new IndexQuery();
        query.setObject(ecl);
        query.setId(ecl.getId);
        query.setIndexName(indexName);
        query.setType(type);
        elasticsearchTemplate.index(query);
    }

    public List<CollectLabel> getByLabel(String label){
        BoolQueryBuilder builder = boolQuery();
        builder.must(termQuery("tag", label));
        //builder.must(nestedQuery("paramContext." + field, termQuery("paramContext." + field + ".trackingId", trackingId)));
        FieldSortBuilder fsb = new FieldSortBuilder("createdAt");
        fsb.order(SortOrder.ASC);

        SearchQuery query = new NativeSearchQueryBuilder()
                .withTypes(TYPE_INTELLIGENT_COLLECT_LABEL.getType())
                .withIndices(EsIndex.INDEX_INTELLIGENT_BASE.getName())
                .withSort(fsb)
                .withQuery(builder).build();
        Iterable<EntityCollectLabel> iterable = elasticsearchTemplate.queryForList(query,EntityCollectLabel.class);
        List<CollectLabel> collectLabels = Lists.newArrayList();
        iterable.forEach(it -> {
            CollectLabel collectLabel = new CollectLabel();
            collectLabel.setCreateAt(it.getCreateAt());
            collectLabel.setUpdateAt(it.getUpdateAt());
            collectLabel.setEmail(it.getEmail());
            collectLabel.setId(it.getId());
            collectLabel.setLabelId(it.getTagId());
            collectLabel.setLabel(it.getTag());
            collectLabels.add(collectLabel);
        });
        return collectLabels;
    }

    public List<CollectLabel> getAll(){
        SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
                .withTypes(TYPE_INTELLIGENT_COLLECT_LABEL.getType())
                .withIndices(EsIndex.INDEX_INTELLIGENT_BASE.getName())
                .withPageable(new PageRequest(0, 200,
                        new Sort(Sort.Direction.DESC,"createAt"))).build();

        Iterable<EntityCollectLabel> iterable = elasticsearchTemplate.queryForList(query,EntityCollectLabel.class);
        List<CollectLabel> collectLabels = Lists.newArrayList();
        iterable.forEach(it -> {
            CollectLabel collectLabel = new CollectLabel();
            collectLabel.setCreateAt(it.getCreateAt());
            collectLabel.setUpdateAt(it.getUpdateAt());
            collectLabel.setEmail(it.getEmail());
            collectLabel.setLabel(it.getTag());
            collectLabel.setId(it.getId());
            collectLabel.setLabelId(it.getTagId());
            collectLabels.add(collectLabel);
        });
        return collectLabels;
    }

//    public void delete(String labelId) {
//        DeleteQuery collectDeleteQuery = new DeleteQuery();
//        BoolQueryBuilder collectBoolQueryBuilder = boolQuery();
//        collectBoolQueryBuilder.must(termQuery("tagId", labelId));
////        collectBoolQueryBuilder.must(termQuery("trackingId", trackingId));
//        collectDeleteQuery.setQuery(collectBoolQueryBuilder);
//        collectDeleteQuery.setIndex(EsIndex.INDEX_INTELLIGENT_BASE.getName());
//        collectDeleteQuery.setType(TYPE_INTELLIGENT_COLLECT_LABEL.getType());
//        collectDeleteQuery.setPageSize(10);
//        elasticsearchTemplate.delete(collectDeleteQuery);
//    }

    public void delete(String id) {
// 这个id是es中的_id 的值
        elasticsearchTemplate.delete(EntityCollectLabel.class, id);
    }

    public void update(String id, String labelId, String label, String email, String createAt) {
        UpdateQuery updateQuery = new UpdateQuery();
        EntityCollectLabel ecl = new EntityCollectLabel();
        ecl.setCreateAt(createAt);
        ecl.setUpdateAt(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        ecl.setEmail(email);
        ecl.setTag(label);
        ecl.setTagId(labelId);
        ecl.setId(id);

//设置es中_id的值
        updateQuery.setId(ecl.getId());
        updateQuery.setClazz(EntityCollectLabel.class);
//        user.setId(null);
        UpdateRequest request = new UpdateRequest();
        request.doc(JSON.toJSONString(ecl));
        updateQuery.setUpdateRequest(request);
        elasticsearchTemplate.update(updateQuery);

    }
}
  1. 依赖
<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>2.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  1. 查询大数据量的方法
//用上面的查询方法查询大数据量会报这个错误
Caused by: QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [500000] but was [510000]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.]
  at org.elasticsearch.search.internal.DefaultSearchContext.preProcess(DefaultSearchContext.java:212)

下面是 (正确做法为什么要用这个方法,其中的原理待记录下)

        public List<TrackingDi> readEsByScroll(String gridId){
            BoolQueryBuilder builder = boolQuery();
            builder.must(
//                    QueryBuilders.matchAllQuery()
                    QueryBuilders.termQuery("grid_id", gridId)
            );
            SearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withQuery(builder)
                    .withIndices(getIndices())
                    .withTypes(EsType.TYPE_DISTRICT.getType())
                    .withPageable(new PageRequest(0,100))
                    .build();
            String scrollId = elasticsearchTemplate.scan(searchQuery,55000,false);
            List<EntityTrackingDi> entityTrackingDiList = new ArrayList<EntityTrackingDi>();
            List<TrackingDi> trackingDiList = new ArrayList<TrackingDi>();
            boolean hasRecords = true;
            while (hasRecords){
                Page<EntityTrackingDi> page = elasticsearchTemplate.scroll(
                    scrollId, 55000L , new SearchResultMapper() {
                        @Override
                        public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                            List<EntityTrackingDi> chunk = new ArrayList<EntityTrackingDi>();
                            for(SearchHit searchHit : searchResponse.getHits()){
                                if(searchResponse.getHits().getHits().length <= 0) {
                                    return null;
                                }
                                EntityTrackingDi entityTrackingDi = new EntityTrackingDi();
                                entityTrackingDi.setWhich_day_week(searchHit.getSource().get("which_day_week").toString());
                                entityTrackingDi.setOrder_count(searchHit.getSource().get("order_count").toString());
                                entityTrackingDi.setShop_business_district_id(searchHit.getSource().get("shop_business_district_id").toString());
                                entityTrackingDi.setCustomer_grid_id(searchHit.getSource().get("customer_grid_id").toString());
                                entityTrackingDi.setGrid_id(searchHit.getSource().get("grid_id").toString());
                                chunk.add(entityTrackingDi);
                            }
                            return new AggregatedPageImpl(chunk);
//                                return new PageImpl<EntityTrackingDi>(chunk);
                        }
                    }
                );
                if(page.hasContent()) {
                    entityTrackingDiList.addAll(page.getContent());
                }
                else{
                    hasRecords = false;
                }
            }
            trackingDiList = TrackingDiConvertor.toTrackingDiList(entityTrackingDiList);
            return trackingDiList;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容