dashy极简搜索:快速搜索功能实现
还在为繁杂的自托管服务管理而烦恼?dashy的智能搜索功能让你一键直达目标应用,告别鼠标点击的繁琐操作。本文将深入解析dashy搜索功能的实现原理,从核心算法到用户体验优化,为你呈现一个完整的搜索系统架构。
搜索功能架构概览
dashy的搜索系统采用分层架构设计,主要包含三个核心模块:
核心搜索算法实现
dashy的搜索功能基于智能模糊匹配算法,在src/utils/Search.js中实现:
// 核心搜索函数 - 多维度匹配
export const searchTiles = (allTiles, searchTerm) => {
if (!searchTerm) return allTiles;
if (!allTiles) return [];
return allTiles.filter((tile) => {
const { title, description, provider, url, tags } = tile;
return filterHelper(title, searchTerm)
|| filterHelper(provider, searchTerm)
|| filterHelper(description, searchTerm)
|| filterHelper(tags, searchTerm)
|| filterHelper(getDomainFromUrl(url), searchTerm);
});
};
// 智能过滤辅助函数
const filterHelper = (compareStr, searchStr) => {
if (!compareStr) return false;
const process = (input) => input?.toString().toLowerCase().replace(/[^\w\s\p{Alpha}]/giu, '');
return process(searchStr).split(/\s/).every(word => process(compareStr).includes(word));
};
搜索匹配维度对比表
| 匹配维度 | 说明 | 示例 | 优先级 |
|---|---|---|---|
| 标题(Title) | 应用的主要名称 | "Plex" → "plex" | 高 |
| 提供商(Provider) | 服务提供商名称 | "GitHub" → "github" | 中 |
| 描述(Description) | 应用的详细描述 | "媒体服务器" → "媒体" | 中 |
| 标签(Tags) | 用户自定义标签 | ["movies", "videos"] → "movie" | 中 |
| 域名(URL Domain) | 从URL提取的域名 | "https://plex.lab.local" → "plex" | 低 |
实时搜索用户体验
搜索界面组件设计
SearchBar组件采用响应式设计,支持普通模式和极简模式:
<template>
<form @submit.prevent="searchSubmitted" :class="minimalSearch ? 'minimal' : 'normal'">
<label for="filter-tiles">{{ $t('search.search-label') }}</label>
<div class="search-wrap">
<input
id="filter-tiles"
v-model="input"
ref="filter"
:placeholder="$t('search.search-placeholder')"
v-on:input="userIsTypingSomething"
@keydown.esc="clearFilterInput" />
</div>
</form>
</template>
键盘交互优化
dashy实现了完整的键盘导航系统:
// 键盘事件处理
handleKeyPress(event) {
const currentElem = document.activeElement.id;
const { key, keyCode } = event;
const notAlreadySearching = currentElem !== 'filter-tiles';
if (/^[/:!a-zA-Z]$/.test(key) && notAlreadySearching) {
// 字母或bang键按下 - 开始搜索
this.$refs.filter.focus();
this.userIsTypingSomething();
} else if (/^[0-9]$/.test(key)) {
// 数字键按下 - 处理自定义热键
this.handleHotKey(key);
} else if (keyCode >= 37 && keyCode <= 40) {
// 方向键导航
this.akn.arrowNavigation(keyCode);
} else if (keyCode === 27) {
// ESC键清除搜索
this.clearFilterInput();
}
}
高级搜索功能
Bangs功能实现
Bangs功能允许用户使用特定前缀快速跳转到指定搜索引擎:
// Bangs处理逻辑
export const getSearchEngineFromBang = (searchQuery, bangList) => {
const bangNames = Object.keys(bangList);
const foundBang = bangNames.find((bang) => searchQuery.includes(bang));
return bangList[foundBang];
};
// 默认Bangs配置
searchBangs: {
'/b': 'bbc',
'/d': 'duckduckgo',
'/g': 'google',
'/r': 'reddit',
'/w': 'wikipedia',
'/y': 'youtube',
'/gh': 'github',
'/so': 'stackoverflow',
'/wa': 'wolframalpha'
}
自定义热键系统
支持为常用应用设置数字热键:
items:
- title: Bookstack
icon: far fa-books
url: https://bookstack.lab.local/
hotkey: 2
- title: Git Tea
icon: fab fa-git
url: https://git.lab.local/
target: workspace
hotkey: 3
搜索引擎集成
支持的搜索引擎列表
dashy内置了丰富的搜索引擎支持:
| 搜索引擎 | 标识符 | 特点 |
|---|---|---|
| DuckDuckGo | duckduckgo | 默认引擎,隐私保护 |
google | 传统搜索巨头 | |
| Whoogle | whoogle | 自托管Google搜索 |
| Wikipedia | wikipedia | 知识百科 |
| GitHub | github | 代码仓库搜索 |
| StackOverflow | stackoverflow | 技术问答 |
自定义搜索引擎配置
支持完全自定义搜索引擎:
appConfig:
webSearch:
searchEngine: custom
customSearchEngine: 'https://searx.local/search?q='
openingMethod: 'newtab'
searchBangs:
'/r': reddit
'/w': wikipedia
'/s': 'https://whoogle.local/search?q='
性能优化策略
实时搜索性能考虑
- 防抖处理:输入时实时过滤,但避免过度渲染
- 缓存机制:常用搜索结果的缓存优化
- 算法优化:使用高效字符串匹配算法
- 内存管理:大型数据集下的内存使用优化
搜索算法复杂度分析
配置示例大全
完整搜索配置示例
appConfig:
webSearch:
# 基本配置
searchEngine: 'duckduckgo'
openingMethod: 'newtab'
disableWebSearch: false
# 自定义搜索引擎
customSearchEngine: ''
# Bangs配置
searchBangs:
'/r': 'reddit'
'/w': 'wikipedia'
'/gh': 'github'
'/so': 'stackoverflow'
'/yt': 'youtube'
':aws': 'https://aws.amazon.com/s?k='
# 高级选项
enableSound: true
searchHistory: true
项目标签优化示例
sections:
- name: Media Services
items:
- title: Plex
description: Media streaming server
icon: favicon
url: https://plex.lab.local
tags: [movies, videos, music, streaming]
- title: Jellyfin
description: Alternative media server
icon: favicon
url: https://jellyfin.lab.local
tags: [movies, videos, open-source]
- title: Sonarr
description: TV show download manager
icon: favicon
url: https://sonarr.lab.local
tags: [tv-shows, downloads, automation]
故障排除与最佳实践
常见问题解决
-
搜索无结果
- 检查标签配置是否正确
- 确认搜索词包含在title、description或tags中
-
Bangs不工作
- 检查searchBangs配置格式
- 确认搜索引擎标识符正确
-
性能问题
- 减少不必要的标签
- 优化项目描述内容
搜索优化建议
- 标签策略:使用具体、相关的标签
- 描述优化:包含关键词的描述文本
- 热键分配:为常用应用分配数字热键
- Bangs定制:根据个人使用习惯定制Bangs
总结
dashy的搜索系统通过智能的多维度匹配算法、实时的键盘交互体验以及丰富的可配置选项,为用户提供了极简而强大的搜索功能。无论是快速定位自托管服务,还是直接进行网络搜索,dashy都能以最高效的方式满足用户需求。
通过合理的标签策略、热键配置和Bangs定制,你可以将dashy打造成一个真正个性化的生产力工具,让应用访问变得前所未有的简单和高效。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



