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);

//設(shè)置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. 查詢大數(shù)據(jù)量的方法
//用上面的查詢方法查詢大數(shù)據(jù)量會報這個錯誤
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;
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锉桑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隅忿,更是在濱河造成了極大的恐慌入客,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚎莉,死亡現(xiàn)場離奇詭異米酬,居然都是意外死亡,警方通過查閱死者的電腦和手機趋箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門淮逻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼懊,“玉大人,你說我怎么就攤上這事爬早。” “怎么了启妹?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵筛严,是天一觀的道長。 經(jīng)常有香客問我饶米,道長桨啃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任檬输,我火速辦了婚禮照瘾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丧慈。我一直安慰自己析命,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布逃默。 她就那樣靜靜地躺著鹃愤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪完域。 梳的紋絲不亂的頭發(fā)上软吐,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音吟税,去河邊找鬼凹耙。 笑死,一個胖子當著我的面吹牛肠仪,可吹牛的內(nèi)容都是我干的肖抱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼藤韵,長吁一口氣:“原來是場噩夢啊……” “哼虐沥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泽艘,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤欲险,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匹涮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體天试,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年然低,在試婚紗的時候發(fā)現(xiàn)自己被綠了喜每。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务唐。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖带兜,靈堂內(nèi)的尸體忽然破棺而出枫笛,到底是詐尸還是另有隱情,我是刑警寧澤刚照,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布刑巧,位于F島的核電站,受9級特大地震影響无畔,放射性物質(zhì)發(fā)生泄漏啊楚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一浑彰、第九天 我趴在偏房一處隱蔽的房頂上張望恭理。 院中可真熱鬧,春花似錦郭变、人聲如沸颜价。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拍嵌。三九已至,卻和暖如春循诉,著一層夾襖步出監(jiān)牢的瞬間横辆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工茄猫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狈蚤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓划纽,卻偏偏與公主長得像脆侮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勇劣,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容