有什么办法可以在搜索双链时优先展示某些路径下的内容块呀

如图 1 ,搜索开心会出来很多之前引用的"开心"的块,但我想优先展示指定路径下的块(如图 2),

目前是给目标块加上了别名使得可以优先命中,如果每个目标块都要加一个别名,似乎有点太繁琐了

有没有什么简单点的办法,可以优先展示指定的块呢

image.png

image.png

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26386 引用 • 109743 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10154 引用 • 46139 回帖 • 61 关注

相关帖子

被采纳的回答
  • 把下面的代码放到 js 代码片段中

    把 searchRefBlockSortBy(['你的路径']); 改成你自己的真实路径即可

    searchRefBlockSortBy(['你的路径']);
    function searchRefBlockSortBy(sortPaths) {
        const originalFetch = window.fetch;
        window.fetch = async function (url, init) {
            // 真正发请求
            const response = await originalFetch(url, init);
    
            // 只处理目标接口
            if (url.toString().toLowerCase().endsWith('/api/search/searchrefblock')) {
                // 克隆一份 response,用来读 body
                const cloned = response.clone();
                let bodyJson;
                try {
                    bodyJson = await cloned.json();
                } catch (e) {
                    // 如果不是 JSON,直接返回原始 response
                    return response;
                }
    
                // 排序返回结果
                const blocks = bodyJson?.data?.blocks;
                if (Array.isArray(blocks)) {
                    blocks.sort((a, b) => {
                        const hPathA = a.hPath || '';
                        const hPathB = b.hPath || '';
                        const isMatchedA = sortPaths.some(prefix =>
                            hPathA.startsWith(prefix.replace(/^\//,'')) || hPathA.includes(`/${prefix.replace(/^\//,'')}`)
                        );
                        const isMatchedB = sortPaths.some(prefix =>
                            hPathB.startsWith(prefix.replace(/^\//,'')) || hPathB.includes(`/${prefix.replace(/^\//,'')}`)
                        );
                        if (isMatchedA && !isMatchedB) return -1;
                        if (!isMatchedA && isMatchedB) return 1;
                        return 0;
                    });
    
                    // 把修改后的数据串回去,构造一个新的 Response
                    const newBody = JSON.stringify(bodyJson);
                    const { status, statusText, headers } = response;
                    return new Response(newBody, { status, statusText, headers });
                }
            }
    
            // 默认返回原始 response
            return response;
        };
    }
    
    

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 把下面的代码放到 js 代码片段中

    把 searchRefBlockSortBy(['你的路径']); 改成你自己的真实路径即可

    searchRefBlockSortBy(['你的路径']);
    function searchRefBlockSortBy(sortPaths) {
        const originalFetch = window.fetch;
        window.fetch = async function (url, init) {
            // 真正发请求
            const response = await originalFetch(url, init);
    
            // 只处理目标接口
            if (url.toString().toLowerCase().endsWith('/api/search/searchrefblock')) {
                // 克隆一份 response,用来读 body
                const cloned = response.clone();
                let bodyJson;
                try {
                    bodyJson = await cloned.json();
                } catch (e) {
                    // 如果不是 JSON,直接返回原始 response
                    return response;
                }
    
                // 排序返回结果
                const blocks = bodyJson?.data?.blocks;
                if (Array.isArray(blocks)) {
                    blocks.sort((a, b) => {
                        const hPathA = a.hPath || '';
                        const hPathB = b.hPath || '';
                        const isMatchedA = sortPaths.some(prefix =>
                            hPathA.startsWith(prefix.replace(/^\//,'')) || hPathA.includes(`/${prefix.replace(/^\//,'')}`)
                        );
                        const isMatchedB = sortPaths.some(prefix =>
                            hPathB.startsWith(prefix.replace(/^\//,'')) || hPathB.includes(`/${prefix.replace(/^\//,'')}`)
                        );
                        if (isMatchedA && !isMatchedB) return -1;
                        if (!isMatchedA && isMatchedB) return 1;
                        return 0;
                    });
    
                    // 把修改后的数据串回去,构造一个新的 Response
                    const newBody = JSON.stringify(bodyJson);
                    const { status, statusText, headers } = response;
                    return new Response(newBody, { status, statusText, headers });
                }
            }
    
            // 默认返回原始 response
            return response;
        };
    }
    
    
    1 回复
  • SyTlr

    谢谢大佬!另外想请教一下,这个路径变量是字符串列表吗,可以用 ',' 分隔多个路径?

    1 回复
  • 是数组,多个路径,可以这样

    searchRefBlockSortBy(['demo1/demox', 'demo1/demo2']);

    2 回复
  • SyTlr

    好的好的,谢谢~

  • SyTlr

    大佬,我有个小疑问,这个 js 片段,支持多级路径吗?

    比如,我的块的路径是 '/文档 A/文档 B/文档 C',我可以在路径变量里填写'/文档 A' 吗?

    比如下面,我直接填写了 [ '/关注的主题' ],似乎搜索排序没有生效

    image.png

    1 回复
  • 支持,你是仅填这一个,还是有其他?如果还有其他,也可能被其他的优先了

    另外,这个是通过 hpath 匹配的,如果你的其他文件夹也有同名路径,也可能匹配到其他的。

    建议,如果其他路径有同名的,建议路径多写点或者用全路径,最好全局唯一。

    1 回复
  • SyTlr 1 评论

    这样子啊。

    我填的变量是:searchRefBlockSortBy(['/🌈新建主题【存放】','/关注的主题']); 我能保证这两个路径是全局唯一的。不过这个搜索结果排在前面的内容块 hpath 没有在这个变量填的路径里。

    另外就是,在 /关注的主题 下还有其他的子路径,比如 /关注的主题/文档A/关注的主题/文档A,我是希望在 /关注的主题 这个 hpath 下的内容块都被优先搜索出来(不管文档深度是多少),所以尝试了只填 hpath 的共同部分,不确定变量格式有没有写正确

    格式没问题,还有一点需要注意,这个代码是在已筛选出来的结果中,把指定的路径排在前面,前提是你搜索关键词必须足够精确,且指定路径下的关键词必须在搜索结果中出现。如果关键词搜索太泛,建议使用精确关键词。
    wilsons
请输入回帖内容 ...

推荐标签 标签

  • 笔记

    好记性不如烂笔头。

    311 引用 • 794 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 319 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    134 引用 • 798 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 613 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    440 引用 • 1238 回帖 • 599 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    591 引用 • 3528 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 86 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 68 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 572 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 633 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 521 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 119 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 615 关注
  • 倾城之链
    23 引用 • 66 回帖 • 167 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 236 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖