dashy极简搜索:快速搜索功能实现

dashy极简搜索:快速搜索功能实现

【免费下载链接】dashy 🚀 A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! 【免费下载链接】dashy 项目地址: https://gitcode.com/GitHub_Trending/da/dashy

还在为繁杂的自托管服务管理而烦恼?dashy的智能搜索功能让你一键直达目标应用,告别鼠标点击的繁琐操作。本文将深入解析dashy搜索功能的实现原理,从核心算法到用户体验优化,为你呈现一个完整的搜索系统架构。

搜索功能架构概览

dashy的搜索系统采用分层架构设计,主要包含三个核心模块:

mermaid

核心搜索算法实现

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内置了丰富的搜索引擎支持:

搜索引擎标识符特点
DuckDuckGoduckduckgo默认引擎,隐私保护
Googlegoogle传统搜索巨头
Whooglewhoogle自托管Google搜索
Wikipediawikipedia知识百科
GitHubgithub代码仓库搜索
StackOverflowstackoverflow技术问答

自定义搜索引擎配置

支持完全自定义搜索引擎:

appConfig:
  webSearch:
    searchEngine: custom
    customSearchEngine: 'https://searx.local/search?q='
    openingMethod: 'newtab'
    searchBangs:
      '/r': reddit
      '/w': wikipedia
      '/s': 'https://whoogle.local/search?q='

性能优化策略

实时搜索性能考虑

  1. 防抖处理:输入时实时过滤,但避免过度渲染
  2. 缓存机制:常用搜索结果的缓存优化
  3. 算法优化:使用高效字符串匹配算法
  4. 内存管理:大型数据集下的内存使用优化

搜索算法复杂度分析

mermaid

配置示例大全

完整搜索配置示例

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]

故障排除与最佳实践

常见问题解决

  1. 搜索无结果

    • 检查标签配置是否正确
    • 确认搜索词包含在title、description或tags中
  2. Bangs不工作

    • 检查searchBangs配置格式
    • 确认搜索引擎标识符正确
  3. 性能问题

    • 减少不必要的标签
    • 优化项目描述内容

搜索优化建议

  1. 标签策略:使用具体、相关的标签
  2. 描述优化:包含关键词的描述文本
  3. 热键分配:为常用应用分配数字热键
  4. Bangs定制:根据个人使用习惯定制Bangs

总结

dashy的搜索系统通过智能的多维度匹配算法、实时的键盘交互体验以及丰富的可配置选项,为用户提供了极简而强大的搜索功能。无论是快速定位自托管服务,还是直接进行网络搜索,dashy都能以最高效的方式满足用户需求。

通过合理的标签策略、热键配置和Bangs定制,你可以将dashy打造成一个真正个性化的生产力工具,让应用访问变得前所未有的简单和高效。

【免费下载链接】dashy 🚀 A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! 【免费下载链接】dashy 项目地址: https://gitcode.com/GitHub_Trending/da/dashy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值