package com.zdcf.search; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.stereotype.Service; import com.zdcf.search.entity.ChnlZhihuSearch; import com.zdcf.search.param.ZhihuSearchParam; import com.zdcf.search.repository.ChnlZhihuRepository; @Service("chnlZhihuSearchService") public class ChnlZhihuSearchService extends BaseSearchService implements IChnlZhihuSearchService { @Autowired private ChnlZhihuRepository chnlZhihuRepository; @Autowired private ElasticsearchTemplate elasticsearchTemplate; //前台用户的搜索 public List<ChnlZhihuSearch> search(ZhihuSearchParam param) { SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(createQuery(param)) .withFilter(createFilter(param)) .withSort(addSort(param)) .withPageable(new PageRequest(param.getI() - 1, param.getS())) .build(); Page<ChnlZhihuSearch> page = elasticsearchTemplate.queryForPage(searchQuery, ChnlZhihuSearch.class); param.setTotalNum((int)page.getTotalElements()); return page.getContent(); } protected QueryBuilder createQuery(ZhihuSearchParam param){ BoolQueryBuilder builder = QueryBuilders.boolQuery(); boolean title = addTitleQuery(param.getTitle(), builder); if(title){ return builder; } return QueryBuilders.matchAllQuery(); } public void index(ChnlZhihuSearch search){ chnlZhihuRepository.index(search); } public void del(int id){ chnlZhihuRepository.delete(id); } public void save(ChnlZhihuSearch search){ chnlZhihuRepository.save(search); } protected boolean addTitleQuery(String title, BoolQueryBuilder builder){ if(StringUtils.isNotBlank(title)){ // title =title.replaceAll("[^a-zA-Z0-9\\u4E00-\\u9FA5]", "");//只查英文、汉字和数字 String titleStr =title.replaceAll("[^\u4E00-\u9FA5]", "");//只查汉字; for(int i=0;i<titleStr.length();i++){ builder.must(QueryBuilders.wildcardQuery("title", "*"+titleStr.charAt(i)+"*")); } return true; } return false; } private BoolQueryBuilder createFilter(ZhihuSearchParam param){ BoolQueryBuilder builder = QueryBuilders.boolQuery(); this.addTitleQuery(param.getTitle(), builder); //默认查已发布的数据 // addDraftFlagFilter(param.getDraftFlag()==null?Constants.PostStatus.Approved:param.getDraftFlag(), builder); // addDelFlagFilter(param.getDelFlag()==null?Constants.IS_DELFLAG_TYPE.NORMAL:param.getDelFlag(),builder); // addApprvlStatusFilter(param.getApprvlStatus()==null?Constants.ApprvlStatus.Approved:param.getApprvlStatus(), builder); return builder; } private void addIDFilter(int id, BoolQueryBuilder builder){ if(id != 0){ builder.must(QueryBuilders.termQuery("id", id)); } } private BoolQueryBuilder createIDFilter(ZhihuSearchParam param){ BoolQueryBuilder builder = QueryBuilders.boolQuery(); addIDFilter(param.getId()==null?0:param.getId(), builder); //默认查询已发布数据 // addDraftFlagFilter(param.getDraftFlag()==null?Constants.PostStatus.Approved:param.getDraftFlag(), builder); // addDelFlagFilter(param.getDelFlag()==null?Constants.IS_DELFLAG_TYPE.NORMAL:param.getDelFlag(),builder); // addApprvlStatusFilter(param.getApprvlStatus()==null?Constants.ApprvlStatus.Approved:param.getApprvlStatus(), builder); return builder; } //查询单个餐饮 // public ChnlFoodSearch searchById(ZhihuSearchParam param) { // SearchQuery searchQuery = new NativeSearchQueryBuilder() // .withFilter(createIDFilter(param)) // .withSort(addSort(param)) // .withPageable(new PageRequest(param.getI()-1, param.getS())) // .build(); // // Page<ChnlFoodSearch> page = elasticsearchTemplate.queryForPage(searchQuery, ChnlFoodSearch.class); // // param.setTotalNum((int)page.getTotalElements()); // // if(null!=page&&page.getTotalElements()>0){ // return page.getContent().get(0); // }else{ // return null; // } // // } }