一 Elasticsearch复杂查询
1.1 构建查询池
// 构建查询池
BoolQueryBuilder bool = QueryBuilders.boolQuery();
1.2 单字段模糊查询 或多字段模糊查询 或复合查询
if (!StringUtils.isBlank(quaryGood.getText1())){
if (!StringUtils.isBlank(quaryGood.getV1())){
MatchQueryBuilder query = QueryBuilders.matchQuery(quaryGood.getText1(), quaryGood.getV1());
bool.must(query);
}
}
QueryBuilders.matchQuery("name","text");
QueryBuilders.multiMatchQuery("text","name1","name2");
1.3 区间查询 时间需要采用毫秒来比较
// 日期区间查询
RangeQueryBuilder created = QueryBuilders.rangeQuery("created");
if (null !=quaryGood.getT1()){
created.from(quaryGood.getT1().getTime());
}
if (null !=quaryGood.getT2()){
created.to(quaryGood.getT2().getTime());
}
bool.must(created);
// 价格区间查询
RangeQueryBuilder price = QueryBuilders.rangeQuery("price");
if (null !=quaryGood.getD1()){
price.from(quaryGood.getD1());
}
if (null !=quaryGood.getD2()){
price.to(quaryGood.getD2());
}
bool.must(price);
1.4 高亮查询 必须在普通查询后增加该功能
首先需要一个自定义工具类
public class HighLightResultMapper implements SearchResultMapper {
@Override
public AggregatedPage mapResults(SearchResponse searchResponse, Class clazz, Pageable pageable) {
long totalHits = searchResponse.getHits().getTotalHits();//获取搜索后数据总条数
List list = new ArrayList<>();
SearchHits hits = searchResponse.getHits();//获取es搜索的数据集合对象
if (hits.getHits().length> 0) {
for (SearchHit searchHit : hits) {//遍历数据集合
Map highlightFields = searchHit.getHighlightFields();//获取要高亮字段
//{"id":"4","title":"出塞","content":"秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。"
T item = JSON.parseObject(searchHit.getSourceAsString(), clazz);//把json串转为目标对象
Field[] fields = clazz.getDeclaredFields();//获取目标对象的所有属性
for (Field field : fields) {//遍历属性
field.setAccessible(true);//设置私有属性可以访问
if (highlightFields.containsKey(field.getName())) {//如果高亮的字段和要封装的对象的名字一致则值要重新封装
try {
// System.out.println("item:"+item);
// System.out.println("highlightFields:"+highlightFields.get(field.getName()).fragments()[0].toString());
//出塞
field.set(item, highlightFields.get(field.getName()).fragments()[0].toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
list.add(item);
}
}
return new AggregatedPageImpl<>(list, pageable, totalHits);
}
}
对想要高亮的字段配置
这里添加自定义的工具类和字段
1.5 排序查询
这里用到了es自带的工具类 字符串转枚举
SortOrder sortOrder = SortOrder.fromString(quaryGood.getSort()); SortBuilders.fieldSort("price").order(sortOrder)
// 排序
if (quaryGood.getSort()==null || quaryGood.getSort()==""){
quaryGood.setSort("asc");
}
SortOrder sortOrder = SortOrder.fromString(quaryGood.getSort());
1.6 实现分页
// 封装 page对象
Page page = new Page<>(pageNum, pageSize);
// 封装总条数
page.setTotal(goodspage.getTotalElements());
// 获取 pageinfo 对象 存放数据
PageInfo info = page.toPageInfo();
info.setList(goodspage.getContent());
model.addAttribute("pg",info);
model.addAttribute("quaryGood",quaryGood);



