9
votes

Recherche de texte intégral dans le cadre de données de base d'Apple

Je voudrais implémenter une recherche de texte complète dans une application iPhone. J'ai des données stockées dans une base de données SQLITE que j'accède via le cadre de données de base. Il suffit d'utiliser des prédicats et un groupe de "contient [CD]" phrases pour chaque mot de recherche et colonne ne fonctionne pas du tout.

Qu'avez-vous fait cela semble bien fonctionner?


2 commentaires

Ceci est très proche de votre question précédente: Stackoverflow.com/questions/1862771 / ...


Oui, mais j'avais des réponses qui étaient moins liées aux données de base et plus lié à la SQLite. J'ai décidé de faire un autre qui est plus spécifique aux données de base.


5 Réponses :


0
votes

J'utilise contient [CD] dans mon prédicat et cela fonctionne bien. Peut-être que vous pourriez poster votre prédicat et nous pouvions voir s'il y a une faute évidente.


1 commentaires

Désolé, je voulais dire que cela ne fonctionne pas bien, comme la performance sage. Je posterai le prédicat lorsque je rentre du travail. Merci!



1
votes

Je suppose que par "ne fonctionne pas bien" tu veux dire "Effectue mal". La recherche en texte intégral est toujours relativement lente, en particulier dans des environnements de mémoire ou d'espace contraint. Vous pourrez peut-être accélérer les choses en vous assurant que les attributs que vous recherchez sont indexés et en utilisant Beginswith [CD] au lieu de contient [CD] . Mon souvenir (ne peut pas trouver le poste de cacoa-dev de suite) est que SQLite utilisera l'index de correspondance de préfixe, mais redevient la recherche linéaire des recherches d'infixe.


2 commentaires

Ok ça a du sens. Je vais essayer ça.


Barry Wark SEZ "La recherche en texte intégral est toujours relativement lente" Ceci est incorrect, peut-être pour cause de malentendus ce qu'une recherche de texte complète est? Les recherches de sous-chaînes qui traduisent dans une instruction SQL comme SQL sont lentes car chaque ligne doit être numérisée. Ceci n'est généralement pas appelé une "recherche en texte intégral" une recherche de texte complète (c'est-à-dire l'utilisation d'un index de texte complet) est souvent rapide, définitivement plus rapide que les déclarations SQL comme SQL. Je vais mettre plus de détails dans une réponse ci-dessous. :)




0
votes

Je travaille sur ce même problème et je viens de me contenter de suivre mon message à ce sujet à ce sujet il y a quelques semaines . Au lieu d'utiliser Contient, j'ai créé une entité distincte avec une instance pour chaque mot canonicalisé. J'ai ajouté un index sur les mots (dans Xcode Model Builder) et peut ensuite utiliser un opérateur de Beginswith pour exploiter l'index. Néanmoins, comme je vient de poster quelques-uns Il y a quelques minutes , le temps de requête est toujours très lent pour même de petits ensembles de données.

Il doit y avoir une meilleure façon! Après tout, nous voyons ce type de recherche de texte intégral dans de nombreuses applications!


3 commentaires

Cela semble être comme la voie à suivre. Je vais lui donner un coup.


Hey DK, avez-vous eu un succès pour accélérer votre recherche? J'ai fait la même chose que vous avez faite ci-dessus et c'était toujours assez lent, comme vous l'avez mentionné.


Weber, j'ai trouvé le succès en supprimant la relation inverse, qui a modifié le schéma et sur des recherches radicalement accélérées. Mais je n'ai toujours pas été testé sur une DB entièrement chargée et je suis inquiet de BLOAT en raison du nouveau schéma. Voir les commentaires dans l'article lié ci-dessus.



9
votes

Nous avons FTS3 fonctionnant très bien sur 150 000 enregistrements. Nous obtenons Subseconde Query Times retourne plus de 200 résultats sur une seule requête de mot clé.

Actuellement, le seul moyen d'obtenir SQLite FTS3 Travailler sur l'iPhone est de compiler votre propre binaire et de le lier à votre projet. À ma connaissance, le binaire inclus dans votre propre projet ne fonctionnera pas avec les données de base. Peut-être que Apple allumera l'option du compilateur FTS3 dans une version future?

Vous pouvez toujours relier votre propre binaire SQLite FTS3 et l'utiliser uniquement pour des recherches de texte intégral. Cela serait très similaire à la façon dont Sphinx ou Lucene est utilisé dans les environnements d'applications Web. Remarque Vous devrez toujours mettre à jour l'index de recherche à un moment donné pour garder la synchronicité avec les magasins de données de base.

bonne chance !!


1 commentaires

Merci Crunchyt, j'espère qu'ils permettent cette option.