Javascript实现博客全文搜索功能

Bootstrap03 案例1:实现搜索书籍页面 组件:媒体对象-Media object <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>书籍商城首页</title> <link rel="stylesheet" type="text/css" href="css/bootstrap.css"/> <script src... 阅读详情

摘要

搜索是一个在购物网站、论文检索网站、社交网站等相关网站中被广泛使用的功能。为了不借助后台代码实现本人博客的搜索功能,本文使用Javascript代码对其进行简单实现。该搜索功能的亮点包括:使用纯前端代码实现搜索功能;对所有的博客建立索引文件,提高检索博客的效率;实现方法简单、操作简便、代码可扩展性强;支持绝大多数浏览器,电脑端和移动端界面和功能基本保持一致。通过在电脑端和移动端测试,基本达到预期目标,仅非搜索模块的推荐视图界面存在小问题。

Javascript实现搜索功能

  • 下面代码实现了读取本地文本文件内容的功能。调用该函数并将待读取的本地文件路径以字符串的形式传入,即可获取到文本文件的内容。例如:let testContent = readfile("files/test.txt")。
// 读文件内容
function readfile(filepath) {
      let xhr = new XMLHttpRequest(),
          okStatus = document.location.protocol === "file:" ? 0 : 200;
      xhr.open('GET', filepath, false);
      xhr.overrideMimeType("text/html;charset=utf-8");//默认为utf-8
      xhr.send(null);
      return xhr.status === okStatus ? xhr.responseText : null;
  }
  • 查询功能被封装在下面的代码中。将该代码嵌入到对应的控件的对应事件中即可运行搜索功能,例如<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search" id="inputSearch" oninput="query(this)">是本文输入框的oninput调用搜索功能。
function query(object) {
    let showView = document.getElementById("showView");
    showView.innerHTML = "";

    let text = readfile("asset/index/search_index.txt");
    let keywords = object.value.trim();
    let allLines = text.split("\n");
    for (let index in allLines) {
        let titleAndContent = allLines[index].split("    ");
        if (titleAndContent[0].toLowerCase().indexOf(keywords.toLowerCase()) > -1) {  // 博客标题中包含关键字的处理
            let rootDiv = document.createElement("div");
            rootDiv.className = "card-header bg-white";
            let titleStr = "<a href=\"blogs/"+ titleAndContent[0] + "\" class=\"text-dark\">" +
                titleAndContent[0].replace('.html', '').replace(new RegExp(keywords , 'gi'), "<span style=\"color:red;\">" + keywords + "</span>") + "</a>";
            rootDiv.innerHTML = "<div class=\"card text-dark bg-white\">\n" +
                "                <div class=\"card-header bg-white\">" + titleStr + "</div>\n" +
                "                <div class=\"card-body\">\n" +
                "                    <p class=\"card-text\">" + titleAndContent[1].split("  ")[0] + "</p>\n" +
                "                    <a href=\"blogs/" + titleAndContent[0] + "\" class=\"btn btn-primary float-md-right\">阅读全文</a>\n" +
                "                </div>\n" +
                "            </div>";

            showView.appendChild(rootDiv);

        } else {
            let content = titleAndContent[1].split("  ");
            for (let i in content) {
                if (content[i].toLowerCase().indexOf(keywords.toLowerCase()) > -1) {
                    let rootDiv = document.createElement("div");
                    rootDiv.className = "card-header bg-white";
                    let titleStr = "<a href=\"blogs/"+ titleAndContent[0] + "\" class=\"text-dark\">" + titleAndContent[0].replace('.html', '') + "</a>";
                    rootDiv.innerHTML = "<div class=\"card text-dark bg-white\">\n" +
                        "                <div class=\"card-header bg-white\">" + titleStr + "</div>\n" +
                        "                <div class=\"card-body\">\n" +
                        "                    <p class=\"card-text\">" + content[i].replace(new RegExp(keywords , 'gi'), "<span style=\"color:red;\">" + keywords + "</span>") + "</p>\n" +
                        "                    <a href=\"blogs/" + titleAndContent[0] + "\" class=\"btn btn-primary float-md-right\">阅读全文</a>\n" +
                        "                </div>\n" +
                        "            </div>";

                    showView.appendChild(rootDiv);
                    break;
                }
            }
        }
    }
    showView.style.visibility = "visible";

    // 如果搜索输入框中的关键字为空或者不匹配博客内容,则将搜索界面隐藏。
    if (object.value.trim() === "" || showView.innerHTML === "") {
        showView.style.visibility = "hidden";
    }

}

本文的实现原理大致是这样的:html中定义一个div用来封装搜索界面,一开始将该div隐藏,然后调用查询功能。查询功能将搜索到结果定义到一个子div中,然后使用DOM将其添加到html中的div,并实时显示搜索结果。完整的代码,可以查看该网址https://github.com/Longweibing/Longweibing.github.io

搜索功能的亮点是用到了索引,主要思路是:为博客建立一个索引,建立索引既可以提高搜索效率,有可以方面管理搜索内容。具体的索引文件为博客的标题和需要检索的内容,每个博客的所有内容分配到一行里。标签与检索内容、检索内容内部分别用四个空格和两个空格隔开,方便格式化操作。使用Javascript读取索引文件,从而查询到具体内容。当博客数量较多时,可以分类别创建不同的索引文件,因此搜索模块的扩展性较强。

测试结果

  • 下图为电脑端测试搜索功能
    电脑端测试搜索功能
  • 下图为移动端测试搜索功能
    移动端测试搜索功能

总结与展望

本文使用纯前端代码实现了博客的搜索功能。不仅介绍了搜索的相关工作,而且细致介绍了代码细节和实现原理。通过在电脑端和移动端测试,落实了搜索功能实现情况。我不是一个专业的前端技术专家,仅仅出于个人兴趣来实现博客的搜索功能,因此代码中存在很多不规范、不合理的部分,希望各位官老爷多多理解和提出宝贵意见。本文行文大致遵循了论文格式,这样可以使文章尽量严谨,也使读者更容易、更全面理解本文。

致谢

感谢相关博主提供的有效、可行的代码片段和相关功能讲解。感谢开源社区、组织提高的高效工具。感谢Github、优快云、Bootstrap、JQery等开源网站、工具。

参考

[1] Bruce_wjh的优快云博客:《JavaScript读取本地文件》
[2] bootstrap官网
[3] jquery官网
[4] github官网
[5] 优快云官网

Claude Code 100个真实案例 - 用AI搭建Next.js SSR博客(SEO满分+暗黑模式) 本案例展示如何使用 Claude Code 搭建一个基于 Next.js 的服务端渲染博客系统,包含 SEO 全面优化、暗黑模式、Markdown 渲染、代码高亮、文章目录自动生成、评论系统,实现 Lighthouse SEO 满分。 阅读详情

相关推荐

JS模拟浏览器实现全局搜索功能

主要介绍了JS模拟浏览器实现全局搜索功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

wikijs部署及中文全文检索

注:postgres13安装后,使用zhparser遇到的大坑,zhparser必须手动安装配置。scws,zhparser(postgres 13中文检索插件)

u013893486的博客 3144

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3296

【亲测免费】 lunr.js - 前端全文搜索引擎

lunr.js - 前端全文搜索引擎 【免费下载链接】lunr.js A bit like Solr, but much smaller and not as bright 项目地址: https://gitcode.com/gh_mirrors/lu/lunr....

gitblog_00029的博客 1705

ESP32-BLE学习1-建立简单的server

start 学习之前,我想尝试使用ESP32的demo建立一个简单的server与手机接进行最基本的数据通信。 这里有BLE的简单讲解BLE资料 因为BLE的连接是具有主从机特性的,就像SPI,USB一些请求只能由主机端发起,连接也需要主机端发起。所以手机要想连上ESP32,就得将ESP32设置为从机模式。 从资料上可以看到,从机端通过Notify通知主机,所以从机就是GATT Server。 在进行ESP32 的demo学习之前,得大体看下ESP32的蓝牙组成,ESP32支持经典蓝牙和低功耗蓝牙4.2,

Spark的博客 1842

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 434

纯前端全文检索的两种实现方案:ElasticLunr.js 和 libsearch

适合需要高性能和灵活搜索功能的场景,支持字段加权和类似 Elasticsearch 的评分机制。libsearch:适合轻量级和简单需求的项目,无需预建索引,支持多种搜索模式。根据你的具体需求,可以选择合适的方案实现纯前端全文检索。如果需要更复杂的功能(如中文分词或高级评分机制),推荐使用;如果需要快速实现轻量级搜索功能,libsearch是一个不错的选择。希望这篇文章对你有所帮助!如果有任何问题或需要进一步的指导,请随时告诉我。

走在搬砖的路上! 1889

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 507

ComfyUI-WanVideoWrapper 视频生成快速跑通与 5 个常见卡点排障指南

ComfyUI-WanVideoWrapper 是面向 WanVideo 系列视频生成模型的 ComfyUI 自定义节点包,提供模型加载、采样、LoRA、显存管理与上下文窗口的全套节点,内置 HuMo、FlashVSR、VACE 等几十种扩展模型。无论你是第一次搭建的新手,还是被某个具体问题卡住的开发者,本文都按症状分章,帮你快速定位并解决安装报错、模型目录放错、显存溢出、版本兼容与首跑异常这几类

gitblog_00445的博客 444

Cursor自动生成测试用例

或者把你已有的规则直接复制粘贴到这个文档内(这里我用的是Markdown格式和CSV格式的测试用例生成规则,可以同时生成Markdown和CSV格式的测试用例)。在AI对话框这里,我们可以看到Cursor会逐步来帮我们生成测试用例,先分析识别需求文档,然后生成测试用例,最后会进行质量检查,确保生成的用例符合规范。生成的Markdown格式,可直接导入Xmind,生成思维导图,对应到具体的功能模块看具体的测试点,逻辑会更直观一些。(1)选中规则文档和需求文档:@你的测试用例规则文档@你的需求文档。

十二测试录 2432

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1588

105、【Ubuntu】【Hugo】搭建私人博客:模糊搜索 Fuse.js(一)

本文分析了Hugo博客搜索功能的核心实现,重点解析了Fuse.js搜索引擎的配置过程。文章首先介绍了如何通过AJAX获取并解析index.json数据,然后详细讲解了Fuse.js的不同版本区别,包括完整版(fuse.min.js)和基础版(fuse.basic.min.js)的功能差异。特别说明了.min表示压缩版本,可减少50%-70%文件体积,而.basic表示精简功能版本。最后解释了Fuse.js版本命名规则,帮助开发者根据需求选择合适的版本。

HIT_Weston的博客 901

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)

阿里云推出国内首个集成“快思考”与“慢思考”能力的 Qwen3-8B 大语言模型,以80亿参数和 128K 上下文支持,重塑AI应用边界并助力开发者高效部署

以微薄之力,予他人些许温暖. 2万+

elasticlunr.js中文使用教程

--- ## 项目介绍 **elasticlunr.js** 是一个轻量级的JavaScript全文搜索引擎库,它提供了类似Elasticsearch的核心功能,使开发者能够在前端无需服务器支持即可实现文本搜索能力。此项目由Simon Weixong维护,特别适合于构建具有本地搜索功能的web应用程序,减少对后端服务的依赖。 ## 项目快速启动 要快速启动并运行elasticlunr.js...

gitblog_01188的博客 452

Python编程基础05:运算符与表达式

文章目录一、算术运算符1、分类说明表2、注意事项3、案例演示任务1、计算成绩差与平均成绩课堂练习:编程处理带余除法。任务2、打印购物小票 运算符就是专门用于告诉程序执行特定运算或逻辑操作的符号。表达式是指由常量、变量和运算符组成的一个算式。编写程序对数据进行处理,其实处理就是对数据实施各种各样的运算,搞懂运算符与表达式是我们编写程序的基础性工作,本次讲课笔记通过案例讲解各种运算符的用法以及正确书写Python表达式的注意事项。 一、算术运算符 Python中的算术运算符就是用来处理四则运算的符号,也是

howard2005的专栏 3120

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

html 博客 全文搜索,为Hexo博客添加全文搜索

本文介绍如何利用hexo-generator-search插件为Hexo博客添加本地全文搜索原理hexo-generator-search实际上是根据网页内容生成了一个数据文件,格式是XML或者JSON。然后通过JS代码去匹配这个文件的内容,从而达到搜索的目的。最终效果步骤安装 hexo-generator-search$ npm install hexo-generator-search --s...

weixin_35629057的博客 660

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Jekyll博客中添加全文本搜索的最佳方案与踩坑记录

-

zorchp 898

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

node全文检索研究

前言 企业中应用比较广泛的是Lucene和Solr,但是需要使用Java Elasticsearch可以使用Node 本文给出几种Node实现全文搜索应用的简单示例 node相关实现方式 text-search MongoDB 全文搜索教程 mongoosejs/mongoose-text-search 优点:mongdb内置,方便 缺点:功能少,效果可能不太理想 倒排索引 MongoDB优化之

vcxiaohan的博客 2169

Vue博客 - yanhe.site

Vue博客 - yanhe.site 介绍 这是我2019暑假开始搭建的个人博客,希望能对你们有所帮助,先上地址。 yanhe.site github 技术栈 参考了其他博客及UI设计,最终选择了以下技术栈 前端:Vue.js 后端:express 数据库:mongodb 请求数据:axios 页面:手撸 + element-ui 其他:mavonEditor , valine 实现功能及优化...

weixin_44365179的博客 326

用 node.js 的 hexo 框架搭建一个支持 markdown 的静态博客系统

1,Hexo如何在线可视化写博客: 可以试试这款插件 hexo-admin. 2,马克飞象: 一个非常好的 markdown 编辑器。 3,Hexo博客文章设置密码的方法: 首先,在Hexo中Markdown语言和html是混用的,因此可以直接在Markdown中直接插入script。 这里用到了windows对象的alert()方法和prompt()方法。p...

dielucui7698的博客 141

Apache DolphinScheduler 数据源接入指南:DB2 连接配置与底层实现解析

Apache DolphinScheduler 内置了对 DB2 数据源的原生支持,用户无需额外安装插件即可在数据源中心创建 DB2 连接,并将其直接用于 SQL 查询、数据同步等任务节点。本文以 DolphinScheduler 官方文档为基础,完整讲解 DB2 数据源的创建步骤与参数含义,并结合仓库源码深入解析 JDBC URL 的组装规则、驱动加载、连接池复用与 SQL 解析等底层实现,帮助

gitblog_00166的博客 415

PHP实现类似百度搜索自动完成(代码简单)

一、效果图: 二、HTML代码 <htmllang="en"><head><metacharset="utf-8"><title>jQueryUI自动完成(Autocomplete)-默认功能</title><linkrel="stylesheet"href="/public/AutoCom/jquery-ui.css"><scriptsrc="/public/AutoCom/jquery-...

fef647的博客 160

实战打造程序员专属博客:集成代码沙盒与学习追踪,快马助你一步到位

为了快速搭建前后端分离的项目,我选择了React作为前端框架,搭配Next.js实现服务端渲染,后端则用Node.js+Express构建API服务。这个博客项目现在已经稳定运行了一段时间,读者反馈最受欢迎的就是可以直接运行代码的功能。设计了"系列-文章"的二级结构,每个系列可以设置封面图和简介,文章会自动按发布时间排序。最近在尝试搭建一个程序员专属的技术博客,除了常规的文章发布功能外,还想加入一些实用的开发工具和学习追踪功能。我实际使用下来,从代码编写到上线部署,整个过程比传统方式节省了至少一半的时间。

BlackironPanther23的博客 26

从零开始搭建个人Hexo博客

从零开始搭建个人Hexo博客 最终个人博客搭建成功后的效果图如:我的博客 购买阿里云服务器和域名 虽然可以把我们的博客系统托管在github上面,但是由于之前我就购买了阿里云服务器,所以就理所当然地直接把博客系统放在自己的云服务器上面了。 首先需要你有一个阿里云账号。你可以在阿里云官网进行注册一个新账号,当然你也可以直接用跟阿里相关的第三方账号如:淘宝账号/支付宝账号/钉钉账号等去登陆阿里云的官网...

UtopiaOfArtoria的博客 3197

VuePress 博客优化之开启 Algolia 全文搜索

前言 在 《一篇带你用 VuePress + Github Pages 搭建博客》中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档。 由于 VuePress 的内置搜索只会为页面的标题、h2 、 h3 以及 tags 构建搜索索引。 如果你需要全文搜索,可则以使用 Algolia 搜索,本篇讲讲如何申请以及配置 Algolia 搜索。 Algolia Algolia 是一个数据库实时搜索服务,能够提供毫秒级的数据库搜索服务,并且其服务能以 API 的形式方便地

冴羽的博客 1942

js离线文档_一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索

介绍Lunr.js是个用于浏览器的轻量级 JavaScript 全文搜索引擎。它为JSON文档建立索引,并提供一个简单的搜索界面来检索与文本查询最匹配的文档对于一些小型的博客、开发者文档或 Wiki 网站来说,完全可以通过它实现站内离线搜索:为什么使用它?对于已经将所有数据存储在客户端中的Web应用程序,也能够在客户端上搜索该数据也是很有意义的。这样可以节省在服务器上添加额外的压缩服务。本地搜索索...

weixin_39907939的博客 1004
上一篇: 注意!三层架构与MVC不是一个概念!
下一篇: Hibernate学习笔记
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值