ESService.java 2.62 KB
Newer Older
张辰's avatar
张辰 committed
1 2 3
package com.tanpu.community.service.base;

import com.alibaba.fastjson.JSON;
张辰's avatar
张辰 committed
4 5
import com.alibaba.fastjson.TypeReference;
import com.tanpu.common.util.JsonUtil;
张辰's avatar
张辰 committed
6 7 8
import com.tanpu.community.api.beans.qo.ESThemeQo;
import com.tanpu.community.api.beans.qo.ThemeQo;
import com.tanpu.community.dao.entity.community.ThemeEntity;
张辰's avatar
张辰 committed
9 10
import com.tanpu.community.model.ESWrapper;
import lombok.extern.slf4j.Slf4j;
11
import org.apache.commons.lang3.StringUtils;
张辰's avatar
张辰 committed
12
import org.elasticsearch.index.query.BoolQueryBuilder;
张辰's avatar
张辰 committed
13
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
张辰's avatar
张辰 committed
14 15 16 17 18 19 20
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
张辰's avatar
张辰 committed
21
import org.springframework.beans.factory.annotation.Value;
张辰's avatar
张辰 committed
22 23 24 25 26 27
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

张辰's avatar
张辰 committed
28
@Slf4j
张辰's avatar
张辰 committed
29 30 31 32 33 34
@Service
public class ESService {

    @Autowired
    private ESHelper helper;

张辰's avatar
张辰 committed
35 36 37 38 39 40 41
    public void insertOrUpdateThemes(List<ESThemeQo> qos) {
        for (ESThemeQo qo : qos) {
            insertOrUpdateTheme(qo);
        }
    }
    // 只要设置了_id,则直接覆盖
    public void insertOrUpdateTheme(ESThemeQo qo) {
张辰's avatar
张辰 committed
42
        helper.insert(String.valueOf(qo.themeType), qo.themeId, JSON.toJSONString(qo));
张辰's avatar
张辰 committed
43 44
    }

45
    public List<ESThemeQo> queryThemeIdByContentAndTitle(String[] keywords, int from, int size) {
张辰's avatar
张辰 committed
46 47 48 49
        SearchSourceBuilder search = new SearchSourceBuilder();

        BoolQueryBuilder boolQb = QueryBuilders.boolQuery();

50
        // 如果关键词带空格,则拆分
51
        for (String k : keywords) {
52 53 54 55 56 57 58
            MatchPhraseQueryBuilder contentQb = QueryBuilders.matchPhraseQuery("textContent", k);
            MatchPhraseQueryBuilder titleQb = QueryBuilders.matchPhraseQuery("title", k);
            boolQb.should(contentQb);
            boolQb.should(titleQb);
        }

        String[] includes = new String[]{"id", "themeId", "createTime", "_score"};
张辰's avatar
张辰 committed
59 60
        String[] excludes = new String[]{};
        search.query(boolQb).fetchSource(includes, excludes).sort("createTime", SortOrder.DESC).from(from).size(size);
张辰's avatar
张辰 committed
61
        search.query(boolQb).sort("createTime", SortOrder.DESC).from(from).size(size);
张辰's avatar
张辰 committed
62

张辰's avatar
张辰 committed
63
        SearchHit[] hits = helper.selectLike(search);
张辰's avatar
张辰 committed
64
        return Arrays.stream(hits).map(h -> {
张辰's avatar
张辰 committed
65
            return JsonUtil.toBean(h.getSourceAsString(), ESThemeQo.class);
张辰's avatar
张辰 committed
66 67
        }).collect(Collectors.toList());
    }
张辰's avatar
张辰 committed
68
}