Comment optimiser la requête de base de données pour la recherche en texte intégral

Puis-je optimiser une Base de Données de requête lors de la recherche pour la mise en correspondance des mots dans un texte? (Cette question concerne également la sagesse de SQL personnalisée rapport de Données de Base sur un iPhone.)

Je suis en train de travailler sur un nouveau (iPhone) de l'application qui est un ordinateur de poche outil de référence pour une base de données scientifiques. L'interface principale est une norme consultable vue de la table et je veux que-vous-type de réponse que l'utilisateur tape des mots nouveaux. Mots matchs doit être préfixes des mots dans le texte. Le texte est composé de 100 000 s de mots.

Dans mon prototype j'ai codé SQL directement. J'ai créé un des "mots" de la table contenant tous les mots dans le texte des champs de l'entité principale. J'mots et effectué des recherches le long de la lignes de

SELECT id, * FROM textTable 
  JOIN (SELECT DISTINCT textTableId FROM words 
         WHERE word BETWEEN 'foo' AND 'fooz' ) 
    ON id=textTableId
 LIMIT 50

Cela va très vite. À l'aide d'un EN serait probablement tout aussi bien, c'est à dire

SELECT * FROM textTable
 WHERE id IN (SELECT textTableId FROM words 
               WHERE word BETWEEN 'foo' AND 'fooz' ) 
 LIMIT 50

La LIMITE est crucial et me permet d'afficher des résultats rapidement. Je l'ai signaler à l'utilisateur qu'il y a de trop nombreux à afficher si la limite est atteinte. C'est encombrants.

J'ai passé les derniers jours à méditer sur les avantages d'un déplacement de Base de Données, mais je m'inquiète de l'absence de contrôle dans le schéma, l'indexation et l'interrogation d'une importante requête.

Théoriquement, un NSPredicate de textField MATCHES '.*\bfoo.*' serait juste de travailler, mais je suis sûr que ce sera lent. Cette sorte de recherche de texte semble tellement commun que je me demande qu'est-ce que l'habitude d'attaque? Voulez-vous créer un mots entité comme je l'ai fait ci-dessus et utiliser un prédicat de "mot BEGINSWITH 'foo'"? Est-ce aussi vite que mon prototype? Sera Base de Données de créer automatiquement le droit d'index? Je ne trouve pas de moyens explicites de conseiller le magasin persistant sur les index.

Je voir quelques belles avantages de Base de Données dans mon iPhone. Les failles et d'autres considérations relatives à la mémoire de permettre la base de données efficace pour les récupérations pour tableview requêtes, sans fixer de limites arbitraires. L'objet graphique de gestion me permet de parcourir aisément les entités sans écrire beaucoup de code SQL. Caractéristiques de Migration va être sympa dans l'avenir. D'autre part, dans une ressource limitée de l'environnement (iPhone) j'ai peur qu'généré automatiquement la base de données va être gonflé à l'aide de métadonnées, inutile inverse des relations, de l'inefficacité de l'attribut type de données, etc.

Doit je faire de la plongée ou de procéder avec prudence?

source d'informationauteur dk.