package com.tanpu.community.service.base; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.tanpu.common.util.JsonUtil; import com.tanpu.community.api.beans.qo.ESThemeQo; import com.tanpu.community.api.beans.qo.ThemeQo; import com.tanpu.community.dao.entity.community.ThemeEntity; import com.tanpu.community.model.ESWrapper; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.index.query.BoolQueryBuilder; 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; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service public class ESService { @Autowired private ESHelper helper; private static final String INDEX_THEME = "theme"; public void insertOrUpdateThemes(List<ESThemeQo> qos) { for (ESThemeQo qo : qos) { insertOrUpdateTheme(qo); } } // 只要设置了_id,则直接覆盖 public void insertOrUpdateTheme(ESThemeQo qo) { helper.insert(INDEX_THEME, String.valueOf(qo.themeType), qo.themeId, JSON.toJSONString(qo)); } public List<ESThemeQo> queryThemeIdByContentAndTitle(String keyword, int from, int size) { SearchSourceBuilder search = new SearchSourceBuilder(); BoolQueryBuilder boolQb = QueryBuilders.boolQuery(); MatchQueryBuilder contentQb = QueryBuilders.matchQuery("textContent", keyword); MatchQueryBuilder titleQb = QueryBuilders.matchQuery("title", keyword); boolQb.should(contentQb); boolQb.should(titleQb); String[] includes = new String[]{"id", "themeId", "createTime"}; String[] excludes = new String[]{}; search.query(boolQb).fetchSource(includes, excludes).sort("createTime", SortOrder.DESC).from(from).size(size); search.query(boolQb).sort("createTime", SortOrder.DESC).from(from).size(size); SearchHit[] hits = helper.selectLike(INDEX_THEME, search); return Arrays.stream(hits).map(h -> { return JsonUtil.toBean(h.getSourceAsString(), ESThemeQo.class); }).collect(Collectors.toList()); } }