全局搜索功能

package com.zhjt.exchange.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhjt.exchange.mapper.GlobalSearchMapper;
import com.zhjt.exchange.service.GlobalSearchService;
import com.zhjt.zh_api.model.search.dto.GlobalSearchRequest;
import com.zhjt.zh_api.model.search.dto.GlobalSearchRes;
import com.zhjt.zh_api.model.search.po.SearchResult;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Service
public class GlobalSearchServiceImpl implements GlobalSearchService {

@Resource
GlobalSearchMapper searchMapper;


/**
 *
 * firstType第一分类:1 业务数据,2 附件,3 功能
 *
 * secondType第二分类,与第一分类对应:
 * 1)业务数据:1 隐患,2 风险,3 事故
 * 2)附件:1 图片,2 视频,3 文件
 * 3)功能无第二分类
 *
 * thirdType第三分类,与第二分类对应:
 * 1)业务数据无第三分类
 * 2)附件
 *  a.图片:1 png,2 bmp,3 jpg,4 jpeg
 *  b.视频:1 mp4
 *  c.文件:1 doc/docx,2 pdf,3 ppt,4 xls/xlsx,5 txt
 * 3)功能无第三分类
 */
@Override
public GlobalSearchRes globalSearch(GlobalSearchRequest request) {
    List<String> keyWordList = new ArrayList<>();
    keyWordList.add(request.getKeyWord());
    // 若输入的关键字不为空,按最多2字符切割组成集合
    /*String keyWord = request.getKeyWord();
    if (StringUtils.isNotBlank(keyWord)) {
        for (int i = 0; i < keyWord.length(); i = i + 2) {
            if (i + 2 <= keyWord.length()) {
                keyWordList.add(keyWord.substring(i, i + 2));
            } else {
                keyWordList.add(keyWord.substring(i, i + 1));
            }
        }
    }*/

    GlobalSearchRes searchResponse = new GlobalSearchRes();
    List<SearchResult> list = new ArrayList<>();
    PageHelper.startPage(request.getPage(), request.getLimit());
    // 查业隐患风险务数据
    if (request.getFirstType() == 1) {
        list = searchMapper.getBusinessData(keyWordList, request.getSecondType(), request.getYear(), request.getMonth());
    }
    // 查文件
    if (request.getFirstType() == 2) {
        /**
         * 按照文件名排序
         * */
        if (!Objects.isNull(request.isFlag())){
            if (1==request.isFlag()){
                list = searchMapper.getFileDataNameAsc(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
                PageInfo<SearchResult> pageInfo = new PageInfo<>(list);

                searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
                searchResponse.setTotal(pageInfo.getTotal());

                return searchResponse;
            }  if (2==request.isFlag()){
                list = searchMapper.getFileDataNameDesc(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
                PageInfo<SearchResult> pageInfo = new PageInfo<>(list);

                searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
                searchResponse.setTotal(pageInfo.getTotal());
                return searchResponse;
            }
        } else{
            list = searchMapper.getFileData(keyWordList, getFileSuffix(request.getSecondType(), request.getThirdType()), request.getYear(), request.getMonth(),request.getFiletype());
        }
    }
    // 查功能
    if (request.getFirstType() == 3) {
        list = searchMapper.getFuncData(keyWordList);
    }


    String filter =request.getKeyWord();
    /**
     * 字符串的list
     */
    List<SearchResult> filterList = new ArrayList<SearchResult>();


    for (SearchResult ss :list){
        System.out.println(ss.getName());
    }
    filterList =   SortByIndex(list,filter);

// List listTOsort = SortByLength(str, filterList.size());
/**
* 按照时间格式升序
* */
if (request.getFirstType() == 2) {
if (!Objects.equals(“desc”, request.getDateSort())) {
filterList = filterList.stream().sorted((a, b) -> {
return a.getCreateDate().compareTo(b.getCreateDate());
}).collect(Collectors.toList());

        } else if (!Objects.equals("asc", request.getDateSort())) {
            {
                filterList = filterList.stream().sorted((a, b) -> {
                    return b.getCreateDate().compareTo(a.getCreateDate());
                }).collect(Collectors.toList());
            }
        }
    }
    PageInfo<SearchResult> pageInfo = new PageInfo<>(filterList);

    searchResponse.setList(initSearchResultList(pageInfo.getList(), keyWordList));
    searchResponse.setTotal(pageInfo.getTotal());

    return searchResponse;
}

/**
 * 获取文件后缀查询条件
 * @Author: zhangzm
 * @Date: 2021-12-22
 * @Modified by:
 * @param oneType
 * @param twoType
 * @return: java.lang.String
 */
public String getFileSuffix(Integer oneType, Integer twoType) {
    String fileSuffix = "";
    if (oneType == 1) { // 图片
        fileSuffix = "png,bmp,jpg,jpeg";
        if (twoType == 1) {
            fileSuffix = "png";
        } else if (twoType == 2) {
            fileSuffix = "bmp";
        } else if (twoType == 3) {
            fileSuffix = "jpg";
        } else if (twoType == 4) {
            fileSuffix = "jpeg";
        }
    } else if (oneType == 2) {// 视频
        fileSuffix = "mp4";
    } else if (oneType == 3) {// 文件
        fileSuffix = "doc,docx,pdf,ppt,xls,xlsx,txt";
        if (twoType == 1) {
            fileSuffix = "doc,docx";
        } else if (twoType == 2) {
            fileSuffix = "pdf";
        } else if (twoType == 3) {
            fileSuffix = "ppt";
        } else if (twoType == 4) {
            fileSuffix = "xls,xlsx";
        } else if (twoType == 5) {
            fileSuffix = "txt";
        }
    }
    fileSuffix = "'" + fileSuffix.replace(",","','") + "'";
    return fileSuffix;
}

/**
 * 若searchResultList中的对象包含有keywordList中的文字,则将对象中的改文字加上标签
 * 前端进行加红、高亮显示该文字
 * @Author: zhangzm
 * @Date: 2021-12-21
 * @Modified by:
 * @param searchResultList
 * @param keywordList
 * @return: void
 */
public List<SearchResult> initSearchResultList(List<SearchResult> searchResultList, List<String> keywordList) {
    List<SearchResult> list = new ArrayList<>();
    if (searchResultList != null && searchResultList.size() > 0) {
        searchResultList.forEach(t -> {
            if (keywordList != null && keywordList.size() > 0) {
                keywordList.forEach(k -> {
                    t.setDescription(t.getDescription() != null ? addSpan(t.getDescription(), k) : "");
                    t.setAddress(t.getAddress() != null ? addSpan(t.getAddress(), k) : "");
                    t.setName(t.getName() != null ? addSpan(t.getName(), k) : "");
                    t.setQyname(t.getQyname() != null ? addSpan(t.getQyname(), k) : "");
                    t.setSolution(t.getSolution() != null ? addSpan(t.getSolution(), k) : "");
                    t.setReason(t.getReason() != null ? addSpan(t.getReason(), k) : "");
                    t.setCategoryname(t.getCategoryname() != null ? addSpan(t.getCategoryname(), k) : "");
                    t.setLevelname(t.getLevelname() != null ? addSpan(t.getLevelname(), k) : "");
                });
            }
            list.add(t);
        });
    }
    return list;
}


/**
 * 为字符串msg中的key添加span标签
 * @Author: zhangzm
 * @Date: 2021-12-23
 * @Modified by: 
 * @param msg
 * @return: java.lang.String
 */
public String addSpan(String msg, String key) {
    return msg.replace(key, "<span style='color:red'>" + key + "</span>");
}

static List SortByLength(String[][] strs,int size) {
    // TODO Auto-generated method stub
    //要检索字符串长度
    for(int i = 0;i<size;i++){
        //该行字符串长度
        int minlen = strs[i][1].length();
        int min = Integer.parseInt(strs[i][2]);
        String str = strs[i][1];
        int minindex = i;
        String sortindex = strs[i][0];
        for(int j = i+1;j<strs.length;j++){
            //if(str.indexOf(filter)==tempstr.indexOf(filter)&&a[j][0].length()<minlen){
            //如果索引相同
            if(strs[i][2].equals(strs[j][2])){
                //如果剩下的字符串的长度小于上一个字符串的长度
                if(strs[j][1].length() <strs[minindex][1].length()){
                    minlen = strs[j][1].length();
                    min = Integer.parseInt(strs[j][2]);
                    str = strs[j][1];
                    sortindex = strs[j][0];
                    minindex = j;
                }
            }
        }
        if(i !=  minindex){
            //交换索引位置
            strs[minindex][2] =  strs[i][2];
            strs[i][2] =  String.valueOf(min);
            //交换字符串位置
            strs[minindex][1] =  strs[i][1];
            strs[i][1] =  str;
            //交换次数位置
            strs[minindex][0] =  strs[i][0];
            strs[i][0] =  sortindex;

        }

    }
    System.out.println("=================================");

    for(int i = 0;i<size;i++){
        //查询到的结果集的第i条数据
        System.out.println(strs[i][1]);
    }
    return java.util.Arrays.asList(strs);
}
/**
 * 根据关键字的索引带大小进行排序
 * @param filterList 包含关键字的list字符数组
 * @param filter 关键字
 * @return 三维字符数组,第一位是原始顺序,第二维是字符串,第三维是索引
 */
static List<SearchResult>  SortByIndex(List<SearchResult> filterList,String filter){
    int size = filterList.size();

// 索引位置
String[][] strs = new String[size][3];
for(int i = 0;i<size;i++){
//查询到的结果集的第i条数据
String str = filterList.get(i).getName().toString();
int index= str.indexOf(filter.toUpperCase());
strs[i][0] = String.valueOf(i);
strs[i][2] = String.valueOf(index);
strs[i][1] = str;
filterList.get(i).setIndex(index);
filterList.get(i).setSort(i);
System.out.println(str+"-索引是"+ str.indexOf(filter)+" 排序是"+i);
}

    filterList.sort((x,y)->Integer.compare(x.getSort(),y.getSort()));
    Collections.sort(filterList, new Comparator<SearchResult>() {
        @Override
        public int compare(SearchResult o1, SearchResult o2) {
            //升序
            return  o1.getIndex().compareTo(o2.getIndex());
        }
    });
    for (SearchResult ss :filterList){
        System.out.println(ss.getIndex()+"qq"+ss.getSort());
    }
    System.out.println(filterList.toString());
    return filterList;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中实现应用程序的全局搜索可以使用Elasticsearch进行实现。引用中的代码片段展示了如何在Java中使用Elasticsearch进行商品的添加操作。你可以通过创建一个Elasticsearch的客户端对象,在该对象中使用IndexRequest来添加商品数据到索引中。 另外,引用中的代码片段展示了如何清除Elasticsearch中的所有商品数据。你可以使用DeleteByQueryRequest来构建一个删除请求,并设置查询条件为匹配所有商品数据。然后使用Elasticsearch的客户端对象执行该删除请求。 除了添加和清除数据,还可以使用Elasticsearch进行搜索操作。你可以创建一个Controller类,如引用中的ElasticSearchController,通过调用ElasticSearchService中的selectItems方法来进行搜索。在该方法中,你可以传入关键字和排序方式作为参数,并返回搜索结果。 总结起来,你可以使用Elasticsearch和Java来实现应用程序的全局搜索功能。通过添加商品数据、清除数据和执行搜索操作,你可以满足全局搜索的需求。123 #### 引用[.reference_title] - *1* *2* *3* [【Java 实战】通过ElasticSearch实现全局搜索功能](https://blog.csdn.net/qq_34383510/article/details/128296562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值