HangulSearch

stability-beta

HangulSearch 是一个支持多种韩语搜索方式的 Swift 库。
您可以利用各种搜索模式来实现对韩语文本数据的灵活搜索功能。

功能

搜索

排序

安装方法

  1. 打开 Xcode,从顶部菜单中选择 File > Swift Packages > Add Package Dependency...
  2. 在搜索框中粘贴 HangulSearch 的 URL:https://github.com/Juhwa-Lee1023/HangulSearch
  3. 选择 main 分支进行安装。
  4. 点击 Next,然后点击 Finish 完成安装。

使用方法

要使用 HangulSearch 库,首先需要创建一个 HangulSearch 实例。
其中需要声明要搜索的数据数组、搜索模式以及提取要搜索的数据属性的 keySelector 闭包。

实例创建示例

创建一个以字符串数组为元素的 HangulSearch 实例。

var searchEngine: HangulSearch<String>?
searchEngine = HangulSearch(items: ["사과", "바나나", "포도"], mode: .containsMatch, keySelector: { $0 })

创建一个以 Person 对象数组为元素的 HangulSearch 实例。

struct Person {
    var name: String
    var age: Int
}

let persons = [Person(name: "철수", age: 25), Person(name: "영희", age: 22)]
var searchEngine: HangulSearch<Person>?
searchEngine = HangulSearch(items: persons, mode: .autocomplete, keySelector: { $0.name })

isEqual 使用方法 isEqual 用于在搜索结果中删除重复项。 默认情况下,它通过 keySelector 比较项目,但在某些情况下,您可以使用 isEqual 来比较两个项目的附加属性,以确定它们是否重复。

何时需要使用

例如,在 Person 对象数组中,如果姓名相同但年龄不同,则仅通过姓名进行比较可能会仅返回重复姓名中的一个。 此时,如果使用 isEqual 来比较 age 属性,则可以防止即使有重复的姓名也仅返回一个。

isEqual 使用示例

struct Person {
    var name: String
    var age: Int
}

let persons = [
    Person(name: "철수", age: 25),
    Person(name: "철수", age: 30),
    Person(name: "영희", age: 22)
]

var searchEngine: HangulSearch<Person>?
searchEngine = HangulSearch(
    items: persons,
    mode: .containsMatch,
    keySelector: { $0.name },
    isEqual: { $0.age == $1.age }  // 추가로 age까지 비교하여 중복을 방지
)

let results = searchEngine?.searchItems(input: "철수")
// 결과: ["철수(25)", "철수(30)"]

按搜索模式的使用方法

1. 初声搜索(chosungAndFullMatch

初声搜索查找与输入的初声相匹配的结果。 例如,如果输入“ㅊㅅ”,则会返回诸如“철수”之类的结果。

    let searchEngine = HangulSearch(items: persons, mode: .chosungAndFullMatch, keySelector: { $0.name })
    let results = searchEngine?.searchItems(input: "ㅊㅅ")
    // results?.map { $0.name } = ["김철수", "이철수", "박철수", "최철수", "최성수", "최상욱", "정철수", "강철수", "초철수", "초성수", "초상욱", "윤철수", "장철수", "임철수"]
点击观看视频
RPReplay_Final1713712676.MP4

2. 完整字符串搜索 (containsMatch)

完整字符串搜索返回包含输入字符串的所有项目。

    let searchEngine = HangulSearch(items: persons, mode: .containsMatch, keySelector: { $0.name })
    let results = searchEngine?.searchItems(input: "철수")
    // results?.map { $0.name } = ["김철수", "이철수", "박철수", "최철수", "정철수", "강철수", "초철수", "윤철수", "장철수", "임철수"]
点击观看视频
RPReplay_Final1713712725.MP4

3. 自动完成搜索 (autocomplete)

自动完成搜索查找包含输入字符串的项目。 例如,如果搜索 "쵳",则可以获得 "최철수" 之类的结果。

    let searchEngine = HangulSearch(items: persons, mode: .autocomplete, keySelector: { $0.name })
    let results = searchEngine?.searchItems(input: "")
    // results?.map { $0.name } = ["최철수"]
点击观看视频
RPReplay_Final1713712800.MP4

4. 综合搜索模式 (combined)

综合搜索模式结合了初声搜索、完整字符串搜索和自动完成搜索,从而提供更多的搜索结果。 此模式为各种输入形式返回最广泛的搜索结果。

点击观看视频
RPReplay_Final1713712837.MP4

排序功能使用方法

1. 字母顺序排序 (hangulOrder)

根据韩语字母顺序对搜索结果进行排序。 例如,结果会按 “ㄱ”、“ㄴ”、“ㄷ” 的顺序显示。

searchEngine?.changeSortMode(mode: .hangulOrder)
let results = searchEngine?.searchItems(input: "철수")
// 결과가 한글 자모 순서대로 정렬됩니다.

2. 字母逆序排序 (hangulOrderReversed)

根据韩语字母顺序的逆序对搜索结果进行排序。 例如,结果会按 “ㅎ”、“ㅍ”、“ㅌ” 的顺序显示。

searchEngine?.changeSortMode(mode: .hangulOrderReversed)
let results = searchEngine?.searchItems(input: "철수")
// 결과가 한글 자모 역순으로 정렬됩니다.

3. 编辑距离排序 (editDistance)

根据搜索词与项目之间的编辑距离(Levenshtein Distance)对项目进行排序,从最相似的项目开始。 即使搜索词不完全匹配,最接近的词也会显示在顶部。

searchEngine?.changeSortMode(mode: .editDistance)
let results = searchEngine?.searchItems(input: "철수")
// 검색어와 가장 유사한 결과부터 순차적으로 정렬됩니다.

4. 匹配位置排序 (matchPosition)

根据搜索词在项目中出现的位置进行排序。 搜索词在项目中出现的位置越靠前,优先级越高。

searchEngine?.changeSortMode(mode: .matchPosition)
let results = searchEngine?.searchItems(input: "")
// "철"이 앞부분에 위치하는 항목이 먼저 표시됩니다.

5. 不排序,保持默认顺序 (none)

按默认数据顺序返回结果,不进行排序。

searchEngine?.changeSortMode(mode: .none)
let results = searchEngine?.searchItems(input: "철수")
// 데이터가 입력된 순서대로 반환됩니다.

使用的数据


如果您想参考测试代码示例以进一步理解和利用该库的功能,请参阅 测试代码


贡献

如果您想为该项目做出贡献,请发送 Pull Request 或提交 Issues。 欢迎任何类型的贡献!


许可

本项目基于 MIT 许可证提供。 有关详细信息,请参阅 LICENSE 文件。