package com.tencent.service.impl;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tencent.dao.IArticleCategoryRefDao;
import com.tencent.dao.IArticleDao;
import com.tencent.dao.IArticleTagRefDao;
import com.tencent.entity.*;
import com.tencent.enums.ArticleCommentStatus;
import com.tencent.service.IArticleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.ScoreSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.elasticsearch.common.text.Text;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service("articleService")
@Slf4j
public class ArticleServiceImpl implements IArticleService {
@Autowired(required = false)
private IArticleDao articleDao;
@Autowired(required = false)
private RestHighLevelClient highLevelClient;
@Autowired(required = false)
private IArticleCategoryRefDao articleCategoryRefDao;
@Autowired(required = false)
private IArticleTagRefDao articleTagRefDao;
@Override
@Transactional(rollbackFor = Exception.class)
public void insertArticle(Article article) {
//添加文章
article.setArticleCreateTime(new Date());
article.setArticleUpdateTime(new Date());
article.setArticleIsComment(ArticleCommentStatus.ALLOW.getValue());
article.setArticleViewCount(0);
article.setArticleLikeCount(0);
article.setArticleCommentCount(0);
article.setArticleOrder(1);
articleDao.insert(article);
//添加分类和文章关联
for(int i=0;i<article.getCategoryList().size();i++){
ArticleCategoryRef articleCategoryRef = new ArticleCategoryRef(article.getArticleId(),article.getCategoryList().get(i).getCategoryId());
articleCategoryRefDao.insert(articleCategoryRef);
}
//添加标签和文章关联
for(int i=0;i<article.getTagList().size();i++){
ArticleTagRef articleTagRef = new ArticleTagRef(article.getArticleId(),article.getTagList().get(i).getTagId());
articleTagRefDao.insert(articleTagRef);
}
}
@Override
public void deleteArticle(Integer articleId) {
articleDao.deleteById(articleId);
}
@Override
public void deleteArticleBatch(List<Integer> ids) {
articleDao.deleteBatch(ids);
}
@Override
public void updateArticle(Article article) {
articleDao.update(article);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateArticleDetail(Article article) {
article.setArticleUpdateTime(new Date());
articleDao.update(article);
if(article.getTagList()!=null){
//删除标签和文章关联
articleTagRefDao.deleteByArticleId(article.getArticleId());
//添加标签和文章关联
for(int i=0;i<article.getTagList().size();i++){
ArticleTagRef articleTagRef = new ArticleTagRef(article.getArticleId(),article.getTagList().get(i).getTagId());
articleTagRefDao.insert(articleTagRef);
}
}
if(article.getCategoryList()!=null){
//删除分类和文章关联
articleCategoryRefDao.deleteByArticleId(article.getArticleId());
//添加分类和文章关联
for(int i=0;i<article.getCategoryList().size();i++){
ArticleCategoryRef articleCategoryRef = new ArticleCategoryRef(article.getArticleId(),article.getCategoryList().get(i).getCategoryId());
articleCategoryRefDao.insert(articleCategoryRef);
}
}
}
@Override
public Integer getArticleUserId(Integer articleId) {
return articleDao.getArticleUserId(articleId);
}
@Override
public Integer countArticle(Integer status) {
Integer count = 0;
try{
count = articleDao.countArticle(status);
}catch(Exception e){
e.printStackTrace();
log.error("根据状态统计文章数,status:{},cause:{}",status,e);
}
return count;
}
@Override
public Integer updateLikeCount(Integer articleId, Integer likeCount) {
return articleDao.updateLikeCount(articleId, likeCount);
}
@Override
public Integer countArticleComment() {
Integer count = 0;
try{
count = articleDao.countArticleComment();
}catch(Exception e){
e.printStackTrace();
log.error("统计文章评论数失败,cause:{}",e);
}
return count; }
@Override
public Integer countArticleView() {
Integer count = 0;
try{
count = articleDao.countArticleView();
}catch(Exception e){
e.printStackTrace();
log.error("统计文章访问量失败,cause:{}",e);
}
return count;
}
@Override
public Integer countArticleByCategoryId(Integer categoryId) {
Integer count = 0;
try{
count = articleCategoryRefDao.countArticleByCategoryId(categoryId);
}catch (Exception e){
e.printStackTrace();
log.error("根据分类统计文章数量失败,categoryId:{},cause:{}",categoryId,e);
}
return count;
}
@Override
public PageInfo<Article> findArticleByEs(RestHighLevelClient client,HashMap<String, Object> criteria, Integer pageIndex, Integer pageSize) {
String keywords = null;
for(String key : criteria.keySet()){
keywords = criteria.get(key).toString();
System.out.println(criteria.get(key));
break;
}
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//设置搜索结果起始行数下标,默认从0开始。
sourceBuilder.from(0);
//设置搜索结果显示条数
sourceBuilder.size(10);
//设置搜索结果超时时间
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
QueryBuilder queryBuilder = null;
MatchPhraseQueryBuilder mpqBuilder1 = null;
MatchPhraseQueryBuilder mpqBuilder2 = null;
MatchPhraseQueryBuilder mpqBuilder3 = null;
String keyword = keywords;
//如果关键词中包含"+",则默认将其拆分为2部分,+的左半部分用来标识查找范围,+的右半部分是关键词
if(keywords.indexOf("+")>-1){
String[] slist = keywords.split("\\+");
String range = slist[0];
keyword = slist[1];
//
if(range.equals("articleTitle")){
mpqBuilder1 = new MatchPhraseQueryBuilder("article_title",keyword);
queryBuilder = QueryBuilders.boolQuery().must(mpqBuilder1);
}else if(range.equals("articleContent")){