krisk / fuse-swift

A lightweight fuzzy-search library, with zero dependencies
MIT License
935 stars 112 forks source link
bitap fuzzy-matching fuzzy-search weighted-search

Fuse

CI Status Version License Platform Donate Donate

What is Fuse?

Fuse is a super lightweight library which provides a simple way to do fuzzy searching.

Demo

Usage

Example 1

let fuse = Fuse()
let result = fuse.search("od mn war", in: "Old Man's War")

print(result?.score)  // 0.44444444444444442
print(result?.ranges) // [CountableClosedRange(0...0), CountableClosedRange(2...6), CountableClosedRange(9...12)]

Example 2

Search for a text pattern in an array of srings.

let books = ["The Silmarillion", "The Lock Artist", "The Lost Symbol"]
let fuse = Fuse()

// Improve performance by creating the pattern once
let pattern = fuse.createPattern(from: "Te silm")

// Search for the pattern in every book
books.forEach {
    let result = fuse.search(pattern, in: $0)
    print(result?.score)
    print(result?.ranges)
}

Example 3

class Book: Fuseable {
    dynamic var name: String
    dynamic var author: String

    var properties: [FuseProperty] {
        return [
            FuseProperty(name: "title", weight: 0.3),
            FuseProperty(name: "author", weight: 0.7),
        ]
    }
}

let books: [Book] = [
    Book(author: "John X", title: "Old Man's War fiction"),
    Book(author: "P.D. Mans", title: "Right Ho Jeeves")
]

let fuse = Fuse()
let results = fuse.search("man", in: books)

results.forEach { item in
    print("index: " + item.index)
    print("score: " + item.score)
    print("results: " + item.results)
    print("---------------")
}

// Output:
//
// index: 1
// score: 0.015
// results: [(key: "author", score: 0.015000000000000003, ranges: [CountableClosedRange(5...7)])]
// ---------------
// index: 0
// score: 0.028
// results: [(key: "title", score: 0.027999999999999997, ranges: [CountableClosedRange(4...6)])]

Example 4

let fuse = Fuse()
fuse.search("Man", in: books, completion: { results in
    print(results)
})

Options

Fuse takes the following options:

Example Project

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

Installation

Fuse is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "Fuse"

License

Fuse is available under the MIT license. See the LICENSE file for more info.