Java8 API文档搜索引擎_4.web模块优化之查询词标红

本专栏已实现搜索引擎的web模块后端程序,见下文:

https://blog.csdn.net/m0_63299495/article/details/157767891?spm=1011.2415.3001.5331https://blog.csdn.net/m0_63299495/article/details/157767891?spm=1011.2415.3001.5331

前端程序见下文:

https://blog.csdn.net/m0_63299495/article/details/157874705?spm=1011.2415.3001.5331https://blog.csdn.net/m0_63299495/article/details/157874705?spm=1011.2415.3001.5331

本文进行查询词标红的优化处理。


目录

[1. 查询词标红](#1. 查询词标红)

[2. 独立成词匹配的边界问题](#2. 独立成词匹配的边界问题)


1. 查询词标红

修改后端代码,在生成搜索结果的描述时,把其中包含查询词的部分加上标记,如套上一层<i>标签先令查询词在前端显示为斜体。

1.1 修改后端

修改后端DocSearcher类的GenDesc方法:

java 复制代码
    // 根据正文生成描述
    private String GenDesc(String content, List<Term> terms){
        int firstPos = -1;
        // 在content中查找存在的分词结果
        for(Term term: terms){
            String word = term.getName();
            firstPos = content.toLowerCase().indexOf(" "+word+" ");
            if(firstPos >= 0)
                break;
        }
        if(firstPos == -1){
            // 所有分词结果都不在正文结果中
            // 直接取正文前300个字符作为描述
            return content.substring(0, 300)+"...";
        }
        // 从firstPos作为基准,向前找300个字符作为描述的起始位置
        String desc = "";
        int descBeg = firstPos < 60 ? 0 : firstPos - 60;
        if(descBeg + 300 > content.length()){
            desc = content.substring(descBeg);
        }else{
            desc = content.substring(descBeg, descBeg+300)+"...";
        }
         /* 实现标红新增部分:
         把描述中和分词结果相同的部分加上<i>标签
         */
        for(Term term: terms){
            String word = term.getName();
            desc = desc.replaceAll("(?i) "+word+" ","<i> "+word+" </i>");
        }
        return desc;
    }

注:(?i)表示忽略大小写进行匹配。

1.2 修改前端

再在前端处针对<i>标签设置样式,将其字体颜色设置为红色即可:

在index.html的<style>标签下增加选择器:

html 复制代码
        .item .desc i{
            color: Crimson;
            /* 去掉斜体 */
            font-style:normal;
        }

重启服务器,再次访问index.html进行查询,以synchronous为例:

可见在描述中,查询词已经被标红。

2. 独立成词匹配的边界问题

仍然以查询array list为例,在结果中找到一个描述中没有被标红的查询词的结果:

使用Ctrl+U打开HTML网页源码,Ctrl+F搜索list,可见在标签内容中是存在list的:

我们目前使用的独立成词匹配方式是在查询词两端各加上一个空格,这使得当前这种但是由于list后紧跟一个右括号(或其他字符)的情况都无法匹配。

Java的String类的indexOf方法不支持\b的正则匹配,此处采用将\b替换为空格后,再使用原本的独立成词匹配方式。修改GenDesc方法中在content中查找存在分词结果的思路:

java 复制代码
        for(Term term: terms){
            String word = term.getName();
            content = content.toLowerCase().replaceAll("\\b"+ word+"\\b"," "+word+" ");
            firstPos = content.indexOf(" "+word+" ");
            if(firstPos >= 0)
                break;
        }

重启服务器进行重新部署,对照上一次的网页源码,可见这次标红成功:

相关推荐
counterxing2 小时前
我整理了一个免费开发资源目录,还做成了 CLI 和 MCP
前端·agent·ai编程
Javatutouhouduan8 小时前
2026Java面试的正确打开方式!
java·高并发·java面试·java面试题·后端开发·java编程·java八股文
JAVA面经实录9178 小时前
Java初级最终完整版学习路线图
java·spring·eclipse·maven
子兮曰9 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
Cat_Rocky9 小时前
k8s-持久化存储,粗浅学习
java·学习·kubernetes
知识领航员10 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
释怀°Believe10 小时前
Spring解析
java·后端·spring
kyriewen10 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
ooseabiscuit10 小时前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
问心无愧051310 小时前
ctf show web 入门42
android·前端·android studio