我有一个有大约100k个条目的字典,并提供了一个搜索功能,用户可以在其中搜索英文/中文字符串,所有包含此字符串的条目都将显示出来。条目的结构如下:
class DictionaryEntry: Object, Identifiable {
@objc dynamic var id: String = NSUUID().uuidString
@objc dynamic var character: String = ""
@objc dynamic var pinyin: String = ""
@objc dynamic var definition: String = ""
}假设我们有以下两个条目:
entry1 = "宝山 / Bǎoshān / Bǎoshān district of Shanghai"
entry2 = "上海 / Shànghǎi / Shanghai" 搜索字符串是“上海”。我通过这种方式过滤条目:
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
.filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
//.sorted(by: ???)因为两个条目都包含搜索字符串,所以两个条目都会出现,但它们还没有按任何逻辑排序。我想根据最高的“覆盖率/匹配度”对结果进行排序。因此,首先应该出现“上海”,然后是“上海大学”,……,最后是“苏州和上海之间的古运河”。有没有内置的领域解决方案?
发布于 2021-01-11 22:28:15
Realm的Results有内置的排序方法,请参阅文档中的Sorting。
如果要根据特定属性进行排序,可以使用sorted(byKeyPath:),它采用单个String来表示要排序的属性名称:
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
.filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
.sorted(byKeyPath: "pinyin")或者,如果您想要根据所有3个属性进行排序,您可以使用sorted(by:),它接受SortDescriptor对象的Sequence,也可以基于键路径创建:
let realm = try! Realm()
realm.objects(DictionaryEntry.self)
.filter("pinyin CONTAINS[cd] %@ OR definition CONTAINS[cd] %@ OR character CONTAINS[cd] %@", searchString, searchString, searchString)
.sorted(by: [SortDescriptor(keyPath: "pinyin"), SortDescriptor(keyPath: "definition"), SortDescriptor(keyPath: "character")])https://stackoverflow.com/questions/65668538
复制相似问题