Ce projet est copié et modifié à partir des liaisons Android SQLite pour prendre en charge le chargement d'extension , les recherches en texte intégral et la segmentation des mots multi-langues . Veuillez lire la documentation SQLite Android Bindings pour plus d'informations.
Les détails suivants, vous devez être au courant avant de l'utiliser:
version 3.17.0 .armeabi-v7a et arm64-v8a . Ce projet fournit des outils exécutés dans la ligne de commande, la prise en charge actuelle Unix-like OS uniquement, exécutez les commandes suivantes vers BUID:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh Vous trouverez maintenant un fichier exécutable nommé sqlite3 et 3 bibliothèques d'extension dans le répertoire ./out . Exécutez les commandes suivantes dans votre ligne de commande pour vérifier si cela fonctionne:
$ cd out
$ . / sqlite3
SQLite version 3 . 17 . 0 2017 - 02 - 13 16 : 02 : 40
Enter " .help " for usage hints.
Connected to a transient in - memory database.
Use " .open FILENAME " to reopen on a persistent database.
sqlite > SELECT sqlite_compileoption_used( ' ENABLE_LOAD_EXTENSION ' );
1
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE spellfix USING spellfix1;
sqlite > INSERT INTO spellfix(word) VALUES ( ' frustrate ' );
sqlite > INSERT INTO spellfix(word) VALUES ( ' Frustration ' );
sqlite > SELECT word FROM spellfix WHERE word MATCH ' frus ' ;
frustrate
Frustration Vérifiez le fichier build.sh pour découvrir les options de compilation, il y a beaucoup plus que vous voudrez peut-être savoir, veuillez lire ce sujet: Comment compiler SQLite.
Tout d'abord, veuillez vous assurer que NDK a installé, puis ajoutez le code suivant dans votre fichier local.properties pour créer les bibliothèques:
ndk.dir=/your/ndk/directory
Les bibliothèques ICU prédéfinies sont placées dans le répertoire ./sqlite3/src/main/jni/sqlite/icu_lib_[arch] , veuillez vérifier ce projet pour obtenir plus d'informations sur la façon de réparer icu4c .
Chargez la bibliothèque native:
System . loadLibrary ( "sqliteX" ); Remplacez l'espace de noms android.database.sqlite par org.sqlite.database.sqlite . Par exemple, ce qui suit:
import android . database . sqlite . SQLiteDatabase ;doit être remplacé par:
import org . sqlite . database . sqlite . SQLiteDatabase ;Pour plus de détails, veuillez lire ce sujet.
FTS3 et FTS4 sont des modules de table virtuelle SQLite qui permet aux utilisateurs d'effectuer des recherches en texte complet sur un ensemble de documents.
Nous utilisons FTS3 et FTS4 pour effectuer des recherches en texte intégral et icu pour effectuer multi-language words segmentation dans SQLite.
Le code suivant montre comment utiliser FTS et ICU .
SQLiteDatabase db = helper . getWritableDatabase ();
// Create an FTS table with a single column - "content"
// that uses the "icu" tokenizer
db . execSQL ( "CREATE VIRTUAL TABLE icu_fts USING fts4(tokenize=icu)" );
// Insert texts into the table created before
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to China.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('Welcome to Beijing.')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('中国欢迎你!')" );
db . execSQL ( "INSERT INTO icu_fts VALUES('北京欢迎你!')" );
// Perform full-text searches
Cursor c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH 'welcome'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for 'welcome': " + c . getString ( 0 ));
// Should be:
// Welcome to China.
// Welcome to Beijing.
}
c . close ();
c = db . rawQuery ( "SELECT * FROM icu_fts WHERE icu_fts MATCH '欢迎'" , null );
while ( c . moveToNext ()) {
Log . d ( TAG , "search for '欢迎': " + c . getString ( 0 ));
// Should be:
// 中国欢迎你!
// 北京欢迎你!
}
c . close (); Vous pouvez utiliser les binary operators pour effectuer des recherches logiques et combiner les fonctions auxiliaires pour effectuer des recherches plus compliquées. Pour plus de détails, veuillez lire la documentation.
SQLite a la capacité de charger des extensions (y compris de nouvelles fonctions SQL définies par l'application, des séquences de collation, des tables virtuelles et des VFSE) au moment de l'exécution. Cette fonctionnalité permet de développer le code pour les extensions et de tester séparément de l'application, puis chargées au besoin.
Fondamentalement, une extension SQLite est un "plugin" qui a implémenté un ensemble de fonctions spécifiques et peut être chargée dans SQLite dynamiquement.
Le code suivant montre comment vérifier si le chargement d'extension est pris en charge:
SQLiteDatabase db = helper . getWritableDatabase ();
Cursor c = db . rawQuery ( "SELECT sqlite_compileoption_used('ENABLE_LOAD_EXTENSION')" , null );
// The result must not be 0
assert ( c . getInt ( 0 ) != 0 );Activer ou désactiver le chargement d'extension:
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false ); Après activé, vous pouvez charger vos extensions maintenant, prenez spellfix comme exemple:
// Load successfully if there are no exceptions thrown
Cursor c = db . rawQuery ( "SELECT load_extension('libspellfix')" , null );
c . moveToFirst ();
Log . i ( TAG , "Load spellfix, result = " + c . getInt ( 0 ));Écrire vos propres extensions est également simple, assurez-vous d'avoir lu ce sujet.
Il y a 3 extensions intégrées, offsets_rank , okapi_bm25 et spellfix , le code source est placé dans le répertoire builtin_extensions . Ces extensions sont activées par défaut, vous pouvez le désactiver en ajoutant le code suivant dans votre fichier local.properties .
useBuiltinExtensions=false
La documentation disait:
Cette table virtuelle SpellFix1 peut être utilisée pour rechercher un grand vocabulaire pour les correspondances rapprochées. Par exemple, SpellFix1 peut être utilisé pour suggérer des corrections aux mots mal orthographiés. Ou, il pourrait être utilisé avec FTS4 pour effectuer une recherche en texte intégral en utilisant des mots potentiellement mal orthographiés.
Vous pouvez télécharger le dernier code source à partir d'ici.
Un rapide coup d'œil:
sqlite > SELECT load_extension( ' ./libspellfix ' );
sqlite > CREATE VIRTUAL TABLE demo USING spellfix1;
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustrate ' , 2 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' Frustration ' , 3 );
sqlite > INSERT INTO demo(word, rank) VALUES ( ' frustate ' , 1 );
sqlite > SELECT word FROM demo WHERE word MATCH ' fru* ' ;
frustrate
Frustration
frustatePlus de détails peuvent être trouvés ici.
Une extension à utiliser avec les offensets de fonction () pour calculer la pertinence simple d'une correspondance FTS. La valeur renvoyée est le score de pertinence (une valeur réelle supérieure ou égale à zéro). Une valeur plus grande indique un document plus pertinent.
Selon la valeur renvoyée par les offsets() , il contient 4 valeur entière sur chaque terme, la dernière valeur est la taille du terme correspondant en octets, généralement la valeur conservera la même
docid content
------ -------
1 sleep
2 sleeping
Lorsque nous exécutons les requêtes:
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;obtiendra exactement les mêmes résultats:
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
Mais nous voulons un score plus élevé sur sleeping enregistré lors de la recherche de sleeping , la fonction offsets_rank analysera la valeur renvoyée par les offsets de fonction et ajustera le score de pertinence. La requête suivante renvoie les documents qui correspondent à la requête en texte intégral triée de la plupart aux moins pertinentes:
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;Les résultats seront:
docid content
------ --------
2 sleeping
1 sleep
Ce fichier est une fourche de SQLite-Okapi-BM25, qui est sous la licence MIT. La fonction de classement utilise la fonction MatchInfo intégrée pour obtenir les données nécessaires pour calculer les scores. Assurez-vous d'avoir lu ces documents avant utilisation.
À l'exception des fichiers inclus dans SQLite, tous les autres fichiers sont sous la licence MIT.