2017-01-12 8 views
0

ユーザーが入力した検索テキストを含むCloudKitレコードを検索しようとしています。CloudKitレコードの一部の単語を検索するにはどうすればよいですか?

  • 項目1
  • 項2
  • 項3
  • 試験1
  • 試験2

私は(文字列形式)これらのタイトルのレコードを持っています私は「含む」を使ってみました:

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

しかし、これは、検索語として完全な単語を使用すると、私が探している結果のみを返します。

EG。 「アイテム」を検索すると、アイテム1、アイテム2、アイテム3が返されますが、「tem」を検索しても結果は得られません。

検索にワイルドカード文字を含める方法や、部分検索テキストを使用する別の方法はありますか?

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

を同じ結果

+0

私に見えます。先行または後続スペースの 'searchText'をチェックしましたか?次に、列名をSwiftの予約語と衝突する可能性のある「self」から変更することを検討することもできます。 3つ目は、同じような構文の 'let predicate = NSPredicate(format:"%K like *%@ * "、" >> your column name << "、searchText.trimmingCharacters(in: .whitespacesAndNewlines)) ' – jboi

+0

空白を確認しました。ありがとうございます。 'Self'はキー名ではなく、[CKQuery spec](https://developer.apple.com/reference/cloudkit/ckquery)の一部です。 "自己キーパスにより、サーバーは検索可能に見えるようになりますたとえば、述語文字列 "@ self"に "blue"が含まれていると、フルテキスト検索に含めるようにマークされたすべてのフィールドで "blue"という単語が検索されます。 "残念ながら、CloudKitフレームワークではlikeはサポートされていません。 – Derek

答えて

1

であなただけのフィールドの先頭からの一部のテキストを検索することができます。

私も試してみました。たとえば、次のように指定することができます。

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

トークンは、レコード内のトークン(単語)を検索して一致します。常に完全な単語を検索します。これまでのところ、この問題の回避策は1つしか見つかりませんでした。検索するフィールドを指定して、生成できる部分トークンをすべて追加フィールドとして生成します。たとえば、テキストが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

よろしくお願いします。私はそれが事実かもしれないと心配した。ありがとう。私のテキストフィールドが不足しているので、その回避策が可能かもしれません。 – Derek

+0

ありがとう!私はこれがインデックスと関係していると思います。それ以外の場合は、フルテーブルスキャンが必要です –

+0

私は別の回避策を考えました。私はすべてのテキストフィールドをダウンロードし、ローカルでフィルタリングを行い、フィルタリングされたローカルインデックスに対応する完全なレコードをフェッチすることができました。やや醜いですが、フィルタリングをよりよく制御できます。私はそれが働いているときに投稿します。 – Derek

関連する問題