2017-01-12 7 views
0

Я пытаюсь найти записи CloudKit, содержащие текст поиска, введенный моими пользователями.Как найти частичное слово в записи CloudKit?

У меня есть записи с этими названиями (в формате String):

  • Пункт 1
  • Пункт 2
  • Пункт 3
  • Тест 1
  • Тест 2

Я попытался использовать 'contains':

let predicate = NSPredicate(format: "self contains %@", searchText) 
let query = CKQuery(recordType: "ShareableItem", predicate: predicate) 
    publicDatabase.perform(query, inZoneWith: nil) { results, error in 
    ... 

Но это только возвращает результаты, которые я ищу, если я использую полное слово в качестве поискового запроса.

EG. Если я ищу «Item», я возвращаю пункты 1, 2 и 3, но если я ищу «tem», я не получаю никаких результатов.

Есть ли способ включить подстановочный знак в поиске или другой способ использования частичного текста поиска?

Я также попытался:

NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText) 

, но с тем же результатом

+0

Выглядит по-моему. Вы проверили 'searchText' для любых ведущих или конечных пробелов? Во-вторых, вы можете изменить имя столбца на «self», которое может столкнуться с зарезервированным словом Swift. И третья вещь, которую вы, возможно, захотите попробовать, - использовать синтаксис «let predicate = NSPredicate (формат:«% K like *% @ * »,« >> ваше имя столбца << », searchText.trimmingCharacters (в: .whitespacesAndNewlines)) ' – jboi

+0

Yep проверяется на наличие пробелов. «Я» - это не имя столбца, это ключевой путь, часть [Спецификация CKQuery] (https://developer.apple.com/reference/cloudkit/ckquery). «Путь к самому ключу заставляет сервер искать в поиске строковые поля для указанной строки токена. Например, предикатная строка @ "self contains 'blue'" ищет слово «синий» во всех полях, помеченных для включения в полнотекстовые поиски ». К сожалению, подобное не поддерживается в среде CloudKit. – Derek

ответ

1

Вы можете осуществить поиск только для частичных текстов с начала поля. Например, вы можете использовать:

NSPredicate(format: "YourTextField BEGINSWITH %@", searchText) 

Поиск совпадений в токенах выполняет поиск токенов (слов) в вашей записи. Он всегда будет искать полные слова. До сих пор я нашел одно обходное решение для этой проблемы, и именно это вы берете поле, в котором вы хотите искать в en, генерируете дополнительное поле со всеми частичными токенами, которые вы можете сгенерировать. Например, если у вас есть поле, содержащее текст search text, тогда вы создадите поле токенов, содержащее s se sea sear searc e ea ear earc earch a ar arc arch r rc rch c ch t te tex e ex ext x xt. Затем все они будут рассматриваться как отдельные токены.

+0

Ouch. Я волновался, что так может быть. Благодарю. Это обходное решение может быть выполнено, поскольку мои текстовые поля короткие. – Derek

+0

Спасибо! Я предполагаю, что это связано с индексами. В противном случае вам понадобится полное сканирование таблицы. –

+0

Я думал о другом обходном пути. Я мог бы загружать все текстовые поля, локально выполнять фильтрацию, а затем извлекать полные записи, соответствующие отфильтрованным локальным индексам. Немного уродливый, но позволяет лучше контролировать фильтрацию. Я отправлю сообщение, когда у меня это получится. – Derek