Volltext-Suche in Apple ' s Core Data Framework
Ich möchte Implementierung einer Volltextsuche in einer iPhone-Anwendung. Ich habe Daten in eine sqlite-Datenbank, die ich den Zugang über das Core Data framework. Nur mit Prädikaten und ORing einem Haufen "enthält[cd]" - Sätze für jeden Suchbegriff und Spalte funktioniert nicht bei allen gut.
Was haben Sie getan, die gut zu funktionieren scheint?
- Dies ist sehr nah an Ihre Vorherige Frage: stackoverflow.com/questions/1862771/...
- Ja, aber ich war immer auf Antworten, die waren weniger mit Core Data und mehr in Verbindung mit sqlite. Ich entschied mich für eine andere, mehr bestimmte Kern-Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wir haben FTS3 arbeitet sehr schön auf 150.000+ records. Wir sind immer subsecond Abfrage mal die Rückgabe über 200 Ergebnisse für ein einzelnes keyword-Abfrage.
Derzeit der einzige Weg, um Sqlite FTS3 arbeiten auf dem iPhone, kompilieren Sie Ihre eigene, binäre und link zu Ihrem Projekt. Meines Wissens nach, der binäre Sie in Ihr eigenes Projekt nicht die Arbeit mit Core Data. Vielleicht wird Apple schalten das FTS3-compiler-option in einer zukünftigen Version?
Können Sie noch den link in Ihre eigene Sqlite-FTS3 binäre und verwenden Sie es nur für die Volltextrecherche. Das wäre sehr ähnlich zu der Weise, die Sphinx oder Lucene werden verwendet in der Web-App-Umgebungen. Hinweis: Sie müssen aktualisieren Sie den Suchindex auf einem Punkt zu halten, Synchronität, mit der Core-Daten speichert.
Glück !!
Ich gehe davon aus, dass durch die "nicht gut funktioniert" Sie meinen, 'schlecht'. Die Volltextsuche ist immer relativ langsam, vor allem in Speicher-oder space-constrained environments. Sie können in der Lage sein, die Dinge zu beschleunigen, indem Sie sicherstellen, dass die Attribute, die Sie suchen, gegen die indiziert sind und mit
BEGINSWITH[cd]
stattCONTAINS[cd]
. Meiner Erinnerung (kann nicht finden die cocoa-dev-post zu dieser Zeit) ist, dass SQLite verwendet wird, verwenden Sie den index für die prefix-matching, sondern fällt zurück auf die lineare Suche für infix-Suche.Benutze ich
contains[cd]
in mein Prädikat und dies funktioniert gut. Vielleicht könntest du deinen post Prädikat, und wir könnten sehen, ob es einen offensichtlichen Fehler.Sqlite hat seine eigene Volltext-Indizierung Modul: http://sqlite.org/fts3.html
Haben Sie volle Kontrolle über die SQL -, die Sie senden, um die db (ich weiß nicht, wie Core Data arbeitet), aber mit der Volltext-Indizierung Modul ist der Schlüssel zur Geschwindigkeit der Ausführung und Einfachheit in der SQL-SELECT-Anweisungen, die Volltext-Suche.
Verwendung ENTHÄLT ist in Ordnung, wenn Sie nicht brauchen, schnelle Ausführung, sondern wählt aus mit kann es nicht machen Verwendung von regulären Indizes, so sind dazu bestimmt zu langsam sein, und je größer die Datenbank ist desto langsamer wird es werden. Mit echten Volltext-Indizierung ermöglicht die gleiche Art von sucht, wie können Sie mit 'ENTHÄLT', aber die Dinge sind indiziert für schnelle Ergebnisse auch bei großen db ' s.
Ich habe das gleiche problem und habe gerade um, um nach oben auf mein Beitrag dazu von vor ein paar Wochen. Anstelle der Verwendung ENTHÄLT, habe ich eine eigene Entität mit einer Instanz für jedes kanonisierten Wort. Ich fügte hinzu, ein index, der die Worte (in XCode model builder) und können dann mit einem BEGINSWITH Betreiber nutzen, um die index. Dennoch, als ich nur gepostet vor ein paar Minuten, query Zeit ist immer noch sehr langsam auch für kleine Datensätze.
Es muss einen besseren Weg geben! Nachdem alle, wir sehen diese Art der Volltext-Suche in vielen apps!