• 售前

  • 售后

热门帖子
入门百科

源码请拿走:用Elasticsearch完成视频检索(有详细注释,学习可用)

[复制链接]
wxf2017 显示全部楼层 发表于 2022-1-13 03:40:00 |阅读模式 打印 上一主题 下一主题
@Service
public class SearchServiceImpl implements SearchService {
    @Autowired
    RestHighLevelClient restHighLevelClient;
    /**
     *
     * @param q   搜索关键字
     * @param page  当前页
     * @param per_page   每页展示条数
     * @return   Map  total_count检索总条数  items检索列表
     */
    @Override
    public Map searchVideos(String q, Integer page, Integer per_page) throws IOException {
        //创建搜索请求
        SearchRequest searchRequest = new SearchRequest("yingxue");
        //创建搜索对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("title", q))
                .from((page - 1) * per_page)  //设置起始条数
                .size(per_page)  //设置每页展示条数
                .highlighter(new HighlightBuilder()  //设置高亮
                        .field("*")    //设置匹配字段为全部匹配
                        .requireFieldMatch(false)    //设置关闭字段匹配
                        .preTags("[color=red&#39]")  //前置标签
                        .postTags("")   //后置标签
                );
        //指定检索的类型、条件source
        searchRequest.types("video").source(searchSourceBuilder);
        //执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        ArrayList list = new ArrayList();
        for (SearchHit hit : searchResponse.getHits().getHits()){
            Map sourceAsMap = hit.getSourceAsMap();
            list.add(sourceAsMap);
        }
        //解析结果
        ArrayList list = new ArrayList();
        for (SearchHit hit : searchResponse.getHits().getHits()) {
            //解析高亮的字段
            Map highlightFields = hit.getHighlightFields();
            //获取高亮字段
            HighlightField title = highlightFields.get("title");
            //原结果
            Map sourceAsMap = hit.getSourceAsMap();
            //将原来的字段换为我们高亮的字段
            if(title!=null){
                Text[] fragments = title.fragments();
                StringBuilder n_title= new StringBuilder();
                for (Text text:fragments){
                    n_title.append(text);
                }
                sourceAsMap.put("title", n_title.toString());//高亮字段替换原来的内容
            }
            list.add(sourceAsMap);
        }
        //返回查询总记录数
        Integer total= Math.toIntExact(searchResponse.getHits().getTotalHits());
        HashMap map = new HashMap();
        map.put("total_count", total);
        map.put("items", list);
        return map;
    }
}

来源:https://blog.caogenba.net/m0_66194642/article/details/122428234
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作