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.ChnlMovieSearch;
import com.zdcf.search.param.MovieSearchParam;
import com.zdcf.search.param.ZhihuSearchParam;
import com.zdcf.search.repository.ChnlMovieRepository;
@Service("chnlMovieSearchService")
public class ChnlMovieSearchService extends BaseSearchService implements IChnlMovieSearchService {
@Autowired
private ChnlMovieRepository chnlMovieRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
//前台用户的搜索
public List<ChnlMovieSearch> search(MovieSearchParam param) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(createQuery(param))
.withFilter(createFilter(param))
.withSort(addSort(param))
.withPageable(new PageRequest(param.getI() - 1, param.getS()))
.build();
Page<ChnlMovieSearch> page = elasticsearchTemplate.queryForPage(searchQuery, ChnlMovieSearch.class);
param.setTotalNum((int)page.getTotalElements());
return page.getContent();
}
protected QueryBuilder createQuery(MovieSearchParam param){
BoolQueryBuilder builder = QueryBuilders.boolQuery();
boolean name = addTitleQuery(param.getName(), builder);
if(name){
return builder;
}
return QueryBuilders.matchAllQuery();
}
public void index(ChnlMovieSearch search){
chnlMovieRepository.index(search);
}
public void del(int id){
chnlMovieRepository.delete(id);
}
public void save(ChnlMovieSearch search){
chnlMovieRepository.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]", "");//只查汉字;
// String titleStr =title;
for(int i=0;i<titleStr.length();i++){
builder.must(QueryBuilders.wildcardQuery("name", "*"+titleStr.charAt(i)+"*"));
}
return true;
}
return false;
}
private BoolQueryBuilder createFilter(MovieSearchParam param){
BoolQueryBuilder builder = QueryBuilders.boolQuery();
this.addTitleQuery(param.getName(), 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);
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;
// }
//
// }
}