news 2026/5/1 5:09:38

全文搜索模块 - Cordova与OpenHarmony混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全文搜索模块 - Cordova与OpenHarmony混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

📌 概述

全文搜索模块提供了快速搜索日记内容的功能。这个模块支持按关键词搜索日记的标题和内容,并提供了搜索结果的高亮显示和排序功能。通过Cordova框架,我们能够在Web层实现高效的搜索界面,同时利用OpenHarmony的全文索引能力加速搜索。

全文搜索模块采用了实时搜索设计,用户输入关键词时,应用会实时显示搜索结果。同时提供了搜索历史功能,用户可以快速重复之前的搜索。

🔗 完整流程

搜索执行流程:用户在搜索框中输入关键词,应用会实时执行搜索。搜索使用数据库的全文索引,快速返回匹配的日记。搜索结果按相关性排序,最相关的结果显示在最前面。

搜索结果展示流程:搜索结果以列表形式展示,每个结果项包含日记标题、摘要和匹配的关键词高亮。用户可以点击结果项打开完整的日记。

搜索历史管理流程:应用自动记录用户的搜索历史。用户可以在搜索框下方看到最近的搜索记录,点击可以快速重复搜索。用户也可以清除搜索历史。

🔧 Web代码实现

// 执行全文搜索asyncfunctionperformSearch(keyword){if(!keyword||keyword.trim().length===0){return[];}try{constresults=awaitdb.searchDiaries(keyword);// 记录搜索历史awaitrecordSearchHistory(keyword);// 按相关性排序returnresults.sort((a,b)=>{constaScore=calculateRelevance(a,keyword);constbScore=calculateRelevance(b,keyword);returnbScore-aScore;});}catch(error){console.error('搜索失败:',error);return[];}}// 计算相关性分数functioncalculateRelevance(diary,keyword){letscore=0;constlowerKeyword=keyword.toLowerCase();constlowerTitle=diary.title.toLowerCase();constlowerContent=diary.content.toLowerCase();// 标题中的匹配权重更高if(lowerTitle.includes(lowerKeyword)){score+=10;}// 内容中的匹配constcontentMatches=(lowerContent.match(newRegExp(lowerKeyword,'g'))||[]).length;score+=contentMatches;returnscore;}// 记录搜索历史asyncfunctionrecordSearchHistory(keyword){try{consthistory=awaitdb.getSearchHistory();constexistingIndex=history.findIndex(h=>h.keyword===keyword);if(existingIndex>=0){// 更新搜索时间history[existingIndex].lastSearched=newDate();}else{// 添加新的搜索记录history.unshift({keyword:keyword,lastSearched:newDate()});// 只保留最近50条if(history.length>50){history.pop();}}awaitdb.saveSearchHistory(history);}catch(error){console.error('记录搜索历史失败:',error);}}

这些函数处理搜索执行、相关性计算和搜索历史记录。calculateRelevance函数根据关键词在标题和内容中的位置和频率计算相关性分数。

// 渲染搜索页面asyncfunctionrenderSearch(){constsearchHistory=awaitdb.getSearchHistory();consthtml=`<div class="search-container"> <div class="search-header"> <h1>全文搜索</h1> <div class="search-box-wrapper"> <input type="text" id="search-input" placeholder="输入关键词搜索..." class="search-input"> <button class="btn-primary" onclick="executeSearch()">搜索</button> </div> </div> <div class="search-history"> <h3>最近搜索</h3> <div class="history-items">${searchHistory.slice(0,10).map(item=>`<button class="history-item" onclick="quickSearch('${item.keyword}')">${item.keyword}</button>`).join('')}</div> <button class="btn-small" onclick="clearSearchHistory()">清除历史</button> </div> <div id="search-results"></div> </div>`;document.getElementById('page-container').innerHTML=html;attachSearchListeners();}// 执行搜索并显示结果asyncfunctionexecuteSearch(){constkeyword=document.getElementById('search-input').value;constresults=awaitperformSearch(keyword);constresultsHtml=`<div class="search-results"> <h2>搜索结果 (${results.length})</h2>${results.length>0?`<div class="results-list">${results.map(result=>`<div class="result-item" onclick="app.navigateTo('diary-edit',${result.id})"> <h3>${highlightKeyword(result.title,keyword)}</h3> <p class="result-excerpt">${highlightKeyword(result.content.substring(0,200),keyword)}...</p> <div class="result-meta"> <span class="pet-tag">${result.petName}</span> <span class="result-date">${formatDate(result.createdAt)}</span> </div> </div>`).join('')}</div>`:`<p class="empty-state">未找到匹配的日记</p>`}</div>`;document.getElementById('search-results').innerHTML=resultsHtml;}// 高亮关键词functionhighlightKeyword(text,keyword){constregex=newRegExp(`(${keyword})`,'gi');returntext.replace(regex,'<mark>$1</mark>');}

这个渲染函数生成了搜索界面,包括搜索框、搜索历史和搜索结果。highlightKeyword函数在搜索结果中高亮显示匹配的关键词。

🔌 原生代码实现

// SearchPlugin.ets - 搜索原生插件 import { fileIo } from '@kit.BasicServicesKit'; @Entry @Component struct SearchPlugin { // 建立全文索引 buildFullTextIndex(diaries: string, callback: (success: boolean) => void): void { try { const data = JSON.parse(diaries); // 建立全文索引逻辑 console.log('[SearchPlugin] 全文索引已建立'); callback(true); } catch (error) { console.error('[SearchPlugin] 建立索引失败:', error); callback(false); } } // 执行全文搜索 performFullTextSearch(keyword: string, callback: (results: string) => void): void { try { // 全文搜索逻辑 const results = []; callback(JSON.stringify(results)); } catch (error) { console.error('[SearchPlugin] 搜索失败:', error); callback(JSON.stringify([])); } } build() { Column() { Web({ src: 'resource://rawfile/www/index.html', controller: new WebviewController() }) } } }

这个原生插件提供了全文索引和搜索功能。通过建立全文索引,我们能够加速搜索速度。

Web-Native通信代码

// 执行原生全文搜索functionperformNativeFullTextSearch(keyword){returnnewPromise((resolve,reject)=>{cordova.exec((result)=>{try{constresults=JSON.parse(result);resolve(results);}catch(error){reject(error);}},(error)=>{console.error('搜索失败:',error);reject(error);},'SearchPlugin','performFullTextSearch',[keyword]);});}

这段代码展示了如何通过Cordova调用原生的全文搜索功能。

📝 总结

全文搜索模块展示了Cordova与OpenHarmony在搜索功能方面的应用。在Web层,我们实现了灵活的搜索界面和结果展示。在原生层,我们提供了全文索引和搜索功能。

通过相关性排序,用户可以快速找到最相关的日记。通过搜索历史,用户可以快速重复之前的搜索。通过Web-Native通信,我们能够充分利用OpenHarmony的搜索能力,为用户提供快速高效的搜索体验。

在实际开发中,建议实现搜索建议功能,提供高级搜索选项,并支持搜索结果的导出。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:55:59

零门槛部署Lucky:让你的设备轻松拥有公网访问能力

零门槛部署Lucky&#xff1a;让你的设备轻松拥有公网访问能力 【免费下载链接】lucky 软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,阿里云盘,ftp,webdav,filebrowser 项目地址: https://gitcode.com/GitHub_Trending/luc/lucky …

作者头像 李华
网站建设 2026/4/17 12:23:59

如何快速掌握MoviePilot:NAS媒体库智能管理的完整实践指南

如何快速掌握MoviePilot&#xff1a;NAS媒体库智能管理的完整实践指南 【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mov/MoviePilot 还在为杂乱无章的NAS媒体库而烦恼吗&#xff1f;每天面对散落在各个文件夹的电影和…

作者头像 李华
网站建设 2026/4/27 6:44:05

百度网盘秒传工具终极使用指南:新手快速入门完整教程

百度网盘秒传工具终极使用指南&#xff1a;新手快速入门完整教程 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 如果您曾经为百度网盘文件分享的繁…

作者头像 李华
网站建设 2026/4/23 12:27:38

EmotiVoice在直播带货中的促销语音模板

EmotiVoice在直播带货中的情感化语音生成实践 在电商直播日益激烈的今天&#xff0c;一个主播能否“把人留住”&#xff0c;往往不在于说了什么&#xff0c;而在于怎么说。一句平淡的“这款面膜补水效果很好”&#xff0c;和一句充满激情的“姐妹们&#xff01;这瓶精华涂上去就…

作者头像 李华
网站建设 2026/5/1 2:29:33

高并发电商实战:基于Java生态的多元化盲盒系统技术实现方案

高并发电商实战&#xff1a;基于Java生态的多元化盲盒系统技术实现方案源码:shuai.68api.cn随着潮玩电商的快速迭代&#xff0c;传统的脚本语言架构在面对瞬时高并发、复杂逻辑扩展以及分布式事务时&#xff0c;往往面临性能瓶颈。本文将深入剖析一套基于Java旗舰级技术栈实现的…

作者头像 李华
网站建设 2026/4/19 12:14:22

零基础入门EmotiVoice:新手快速上手教程

零基础入门EmotiVoice&#xff1a;新手快速上手教程 你有没有想过&#xff0c;只需几秒钟的录音&#xff0c;就能让AI“说”出和你一模一样的声音&#xff1f;还能让它带着喜悦、愤怒或悲伤的情绪朗读任何文字&#xff1f;这不再是科幻电影里的桥段——EmotiVoice 正在将这种能…

作者头像 李华