首页 > 其他分享 >es 查询

es 查询

时间:2023-06-22 23:22:05浏览次数:34  
标签:search dto title 查询 elasticsearch org import es

package com.heima.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.search.dtos.UserSearchDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.search.model.UserSearchDto.UserSearchDto;
import com.heima.search.service.ApUserSearchService;
import com.heima.search.service.ArticleSearchService;
import com.heima.utils.thread.AppThreadLocalUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.avro.data.Json;
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.*;
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.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class ArticleSearchServiceImpl implements ArticleSearchService {

@Autowired
private RestHighLevelClient restHighLevelClient;

@Autowired
private ApUserSearchService apUserSearchService;

/**
* es文章分页检索
*
* @param dto
* @return
*/
@Override
public ResponseResult search(UserSearchDto dto) throws IOException {

// if(StringUtils.isBlank(dto.getSearchWords()) || null == dto){
// return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
// }
//
// SearchRequest request = new SearchRequest("app_info_article");
// SearchSourceBuilder builder = new SearchSourceBuilder();
// //关键词的分词之后查询
// QueryStringQueryBuilder queryStringQueryBuilder1 = QueryBuilders.queryStringQuery(dto.getSearchWords()).
// field("title").field("content").defaultOperator(Operator.OR);
// //小于mindate的数据
// BoolQueryBuilder boolQueryBuilder1 = QueryBuilders.boolQuery();
// //range就是根据某个范围来进行查询 同时是getTime毫秒值就是时间戳的意思
// RangeQueryBuilder publishTime = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinBehotTime().getTime());
// boolQueryBuilder1.filter(publishTime);
// //分页查询
// builder.from(0);
// builder.size(dto.getPageSize());
// //按照发布时间倒序排序
//
// request.source().sort("publishTime",SortOrder.DESC);
//
//
// //高亮
//
// HighlightBuilder highlightBuilder = new HighlightBuilder();
// highlightBuilder.field("title");
// //高亮的颜色和字体
// builder.highlighter(highlightBuilder);
//
// highlightBuilder.preTags();
// highlightBuilder.postTags();
// builder.query(boolQueryBuilder1);
// request.source(builder);
// SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
//




//1.检查参数
if(dto == null || StringUtils.isBlank(dto.getSearchWords())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}

ApUser user = AppThreadLocalUtil.getUser();

//异步调用 保存搜索记录
if(user != null && dto.getFromIndex() == 0){
apUserSearchService.insert(dto.getSearchWords(), user.getId());
}


//2.设置查询条件
SearchRequest searchRequest = new SearchRequest("app_info_article");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

//布尔查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

//关键字的分词之后查询
QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(dto.getSearchWords()).field("title").field("content").defaultOperator(Operator.OR);
boolQueryBuilder.must(queryStringQueryBuilder);

//查询小于mindate的数据 同时是getTime毫秒值就是时间戳的意思
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinBehotTime().getTime());
boolQueryBuilder.filter(rangeQueryBuilder);

//分页查询
searchSourceBuilder.from(0);
searchSourceBuilder.size(dto.getPageSize());

//按照发布时间倒序查询
searchSourceBuilder.sort("publishTime", SortOrder.DESC);

//设置高亮 title
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.preTags("<font style='color: red; font-size: inherit;'>");
highlightBuilder.postTags("</font>");
searchSourceBuilder.highlighter(highlightBuilder);


searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);


//3.结果封装返回

List<Map> list = new ArrayList<>();
//hit 是命中数
SearchHits hits1 = searchResponse.getHits();
//命中的总条数
TotalHits totalHits = hits1.getTotalHits();

// SearchHit[] hits2 = searchResponse.getHits().getHits();
// for (SearchHit documentFields : hits2) {
// String sourceAsString = documentFields.getSourceAsString();
// Map map = JSON.parseObject(sourceAsString, Map.class);
// }


SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
Map map = JSON.parseObject(json, Map.class);
//处理高亮
if(hit.getHighlightFields() != null && hit.getHighlightFields().size() > 0){
//同时可能有多个高亮,需要同时拿到
Text[] titles = hit.getHighlightFields().get("title").getFragments();
String title = StringUtils.join(titles);
//高亮标题
map.put("h_title",title);
}else {
//原始标题
map.put("h_title",map.get("title"));
}
list.add(map);
}

return ResponseResult.okResult(list);

}
}

标签:search,dto,title,查询,elasticsearch,org,import,es
From: https://www.cnblogs.com/ZhangZiXue/p/17498558.html

相关文章

  • es多字段查询:queryString
      https://blog.csdn.net/zl18603543572/article/details/129629817 ......
  • Maven小知识:1.packagingpompackaging是什么意思?2.propertiesproperties标签作用?3.depe
    Maven小知识:(1)<packaging>pom</packaging>是什么意思?1、配置<packaging>pom</packaging>的意思是使用maven分模块管理,都会有一个父级项目,pom文件一个重要的属性就是packaging(打包类型),一般来说所有的父级项目的packaging都为pom,packaging默认类型jar类型,如果不做配置,maven会将......
  • Games101-Cp4-Geometry
    几何表示方法隐式表达对应通过隐函数表示点的相对位置,而不是空间的具体位置。具体有:代数公式、水平集、分形/自相似(fractals)、CSG(constructivesolidgeometry):通过简单几何体的布尔运算获得复杂的几何体、距离函数:指的是到几何体点的最小距离,当两个几何体的点近,通过融合距离函......
  • 2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试
    2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试给你一个二维数组classes,其中classes[i]=[passi,totali]表示你提前知道了第i个班级总共有totali个学生,其中只有passi个学生可以通过考试给你一个整数extraStudents,表示额外有......
  • postgresql获取基于当前时间计算的当月第一天,最后一天,下个月的第n天等功能
    问题现象:​今天在项目开发中遇到了一个需求,在编写某个功能时,需要使用到基于某个时间(如当前时间),去获取本月第一天或下个月的第一天的数据.问题分析:通过查询资料可以得知,要实现这个需求并不容易,在sql语句中就能很好的获取到,这里我使用的是postgresql数据库,其他数......
  • postgresql数组数据
    一个包含数组的数据表插入数组有两种方法1:'{张三,李四,王五}'2:  array['张三','李四','王五']用单引号,不用双引号insertintopublic.hi6values('2023-9-22',array['张三','李四'],'{王五,孙六,黄七}','test4'); 查询嘉宾......
  • Nginx安装、不能启动的解决办法(无sbin目录,无error.log及access.log文件)、简单文件服务
    基于Nginx搭建的http服务器应用已愈发广泛,本文介绍的Nginx的相关内容都是在Linux环境下搭建完成的。一、Nginx的安装两种方法,二选一即可,有运行不成功的,就在命令前加sudo[安装方法一]##添加源sudorpm-Uvhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cen......
  • PostgreSQL 时间函数 extract函数和epoch 新纪元时间的使用
    Extract属于SQL的DML(即数据库管理语言)函数,同样,InterBase也支持Extract,它主要用于从一个日期或时间型的字段内抽取年、月、日、时、分、秒数据,因此,它支持其关健字YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、WEEKDAY、YEARDAY。计算时间差天数selectextract(dayFROM(age(......
  • PostgreSQL合并多行数据为一行,string_agg函数
    通过id列来聚合belong_user_saved列,应用string_agg函数,只要id一样则把第二列通过逗号连接起来聚合前:聚合后:SELECT C.ID, string_agg(u.name::varchar,',')belong_user_savedFROM customerC leftjoincustomer_territoryctonct.customer=c.id leftjoinuser_......
  • PostgreSql的聚合函数--string_agg
    聚合函数顾名思义,聚合函数就是类似于min(),max(),sum()等函数,当然这些都是SQL标准的函数,应该都是比较熟悉,也比较常见。这边不对这些常见的函数进行介绍,主要涉及的是PostgreSql自带的一些特色聚合函数进行介绍,自己学习,也与大家共享。主要介绍的聚合函数:String_agg,xmlagg,array_ag......