fuse-swift实战教程:从零开始构建高性能字符串搜索功能

发布时间:2026/6/6 15:59:56

fuse-swift实战教程:从零开始构建高性能字符串搜索功能 fuse-swift实战教程从零开始构建高性能字符串搜索功能【免费下载链接】fuse-swiftA lightweight fuzzy-search library, with zero dependencies项目地址: https://gitcode.com/gh_mirrors/fu/fuse-swiftfuse-swift是一款轻量级模糊搜索库零依赖它是fuse.js的官方Swift移植版提供字节级等效的结果和符合Swift语言习惯的API能与上游每个版本保持同步。本教程将带您从零开始快速掌握如何使用fuse-swift构建高性能的字符串搜索功能让您的应用轻松拥有强大的模糊搜索能力。快速了解fuse-swift为什么选择它fuse-swift作为一款优秀的模糊搜索库具有诸多优势。它支持iOS 15、macOS 12、tvOS 15、watchOS 8、visionOS 1以及Linux等多种平台且要求Swift 6.0或更高版本在严格并发模式下构建无警告。其核心特点是能够实现高性能的模糊搜索即使是对于大量数据也能快速返回准确的搜索结果。环境准备安装fuse-swift要使用fuse-swift首先需要进行安装。在Package.swift文件中添加以下依赖// Package.swift dependencies: [ .package(url: https://gitcode.com/gh_mirrors/fu/fuse-swift, from: 2.0.0), ]这样就可以将fuse-swift集成到您的项目中为后续的开发做好准备。基础入门字符串数组搜索简单示例搜索水果列表下面通过一个简单的例子来演示如何使用fuse-swift进行字符串数组搜索。假设有一个水果列表我们要从中搜索包含“ange”的水果。import Fuse let fruits [apple, orange, banana, pear, grape, kiwi, mango, plum] let options try FuseOptionsString(includeScore: true) let fuse try Fuse.SearchString(fruits, options: options) for r in fuse.search(ange, limit: 3) { print(r.refIndex, r.item, r.score!) } // 1 orange 0.02 // 6 mango 0.26 // 2 banana 0.51在这个示例中我们首先导入Fuse模块创建了一个水果数组。然后设置搜索选项指定包含搜索分数。接着创建Fuse.Search实例传入水果数组和选项。最后调用search方法进行搜索指定搜索关键词“ange”和返回结果的限制数量3。运行结果会按分数从低到高返回匹配的水果及其相关信息。进阶应用键控对象搜索带权重键的对象搜索除了简单的字符串数组搜索fuse-swift还支持对键控对象进行搜索并且可以为不同的键设置权重。例如我们有一个书籍对象数组每个书籍包含标题和作者信息我们希望搜索标题和作者的名字并为标题设置较高的权重。import Fuse struct Book: Codable, Sendable { let title: String let author: Author } struct Author: Codable, Sendable { let firstName: String let lastName: String } let books [ Book(title: Old Mans War, author: .init(firstName: John, lastName: Scalzi)), Book(title: The Lock Artist, author: .init(firstName: Steve, lastName: Hamilton)), Book(title: HTML5, author: .init(firstName: Remy, lastName: Sharp)), ] let options try FuseOptionsBook( includeMatches: true, includeScore: true, keys: [ try FuseKeyBook(title, keyPath: \Book.title, weight: 0.7), try FuseKeyBook(path: author.firstName, weight: 0.3), ] ) let fuse try Fuse.SearchBook(books, options: options) let results fuse.search(stve) print(results[0].item.title) // The Lock Artist这里我们定义了Book和Author结构体创建了书籍数组。在搜索选项中我们设置了包含匹配项和分数并为标题和作者的名字分别创建了FuseKey其中标题的权重为0.7作者名字的权重为0.3。搜索关键词“stve”时会根据权重综合计算分数返回最匹配的书籍。高级功能突出显示匹配结果当设置includeMatches为true时每个FuseResult.matches条目会携带匹配的子记录值、排序后的UTF-16索引等信息。我们可以利用这些信息来突出显示匹配的部分。func highlight(_ value: String, ranges: [FuseRange]) - String { guard !ranges.isEmpty else { return value } let units Array(value.utf16) var out var cursor 0 for r in ranges { if r.start cursor { out String(decoding: units[cursor..r.start], as: UTF16.self) } out [ String(decoding: units[r.start..(r.end 1)], as: UTF16.self) ] cursor r.end 1 } if cursor units.count { out String(decoding: units[cursor..units.count], as: UTF16.self) } return out } // 假设搜索结果r来自search(Lock, limit: 1) // for m in r.matches ?? [] { // print(highlight(m.value ?? , ranges: m.indices)) // // → The [Lock] Artist // }这个highlight函数会根据匹配的范围将匹配的部分用中括号括起来从而突出显示搜索结果中的匹配内容。索引持久化提升搜索性能对于大型集合构建索引可能需要一定的时间。fuse-swift支持索引的创建、序列化和解析以便在后续使用时快速加载提升搜索性能。let books /* ... */ let keys [try FuseKeyBook(title, keyPath: \Book.title)] // 构建一次持久化存储 let index try Fuse.createIndex(keys, books) let data try index.toJSON() try data.write(to: cacheURL) // 后续解析索引使用预构建的索引创建Fuse.Search let restored: FuseIndexBook try Fuse.parseIndex(try Data(contentsOf: cacheURL)) let fuse try Fuse.SearchBook( books, options: try FuseOptionsBook(keys: keys), index: restored )通过这种方式我们可以在应用启动时加载预构建的索引避免每次都重新构建大大提高搜索的响应速度。并发处理在多线程环境中使用fuse-swiftfuse-swift的Fuse.Search是非Sendable的在并发环境中使用时需要注意隔离。以下是两种常见的并发处理模式。actor包装模式对于长期存在的语料库的重复搜索将Fuse.Search包装在actor中是一种规范的模式actor的隔离保证了对非Sendable搜索器的串行访问。actor BookSearchService { private let fuse: Fuse.SearchBook init(books: [Book]) throws { self.fuse try Fuse.SearchBook( books, options: try FuseOptionsBook( includeScore: true, keys: [try FuseKeyBook(path: title)] ) ) } func search(_ query: String) - [FuseResultBook] { fuse.search(query) } } let service try BookSearchService(books: books) let results await service.search(stve) // 跳出调用者的隔离Task.detached模式对于临时的一次性搜索可以在Task.detached中构建Fuse.Search实例。let docs: [String] [apple, orange, banana] let opts try FuseOptionsString(includeScore: true) let query ange let results try await Task.detached(priority: .userInitiated) { let fuse try Fuse.SearchString(docs, options: opts) return fuse.search(query) }.value实际案例运行示例程序fuse-swift提供了多个示例程序帮助您更好地理解其用法。CLI示例cd Examples/CLI swift run FuseCLI # 默认查询 swift run FuseCLI stve # 对两个 fixture 进行自定义查询并发示例cd Examples/Concurrency swift run FuseConcurrency突出显示示例cd Examples/Highlighting swift run FuseHighlighting通过运行这些示例您可以直观地看到fuse-swift在不同场景下的应用效果。总结fuse-swift是一款功能强大、易于使用的模糊搜索库通过本教程的学习您已经掌握了其基本用法和高级功能。从简单的字符串数组搜索到复杂的键控对象搜索从索引持久化到并发处理fuse-swift都能满足您的需求。现在您可以将fuse-swift集成到您的项目中为用户提供高效、准确的搜索体验。如果您想了解更多关于fuse-swift的信息可以参考项目中的官方文档如docs/CONCURRENCY.md、docs/MIGRATION.md等。【免费下载链接】fuse-swiftA lightweight fuzzy-search library, with zero dependencies项目地址: https://gitcode.com/gh_mirrors/fu/fuse-swift创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻