이 프로젝트는 SQLITE Android 바인딩에서 복사 및 수정하여 확장로드 , 전체 텍스트 검색 및 다중 언어 단어 세분화를 지원합니다. 자세한 내용은 SQLITE Android 바인딩 문서를 읽으십시오.
다음과 같은 세부 사항을 사용하기 전에 알아야합니다.
version 3.17.0 과 함께 SQLITE3을 사용합니다.armeabi-v7a 및 arm64-v8a 입니다. 이 프로젝트는 명령 줄, 현재 지원 Unix-like OS 에서만 실행되는 도구를 제공하고 다음 명령을 Buid에 실행합니다.
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh 이제 디렉토리 ./out 에 sqlite3 및 3 개의 확장 라이브러리라는 실행 파일이 있습니다. 명령 줄에서 다음 명령을 실행하여 작동하는지 확인하십시오.
$ 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 file build.sh 확인하려면 컴파일 옵션을 찾으려면 알고 싶은 더 많은 것이 있습니다.이 주제를 읽으십시오 : sqlite를 컴파일하는 방법.
첫 번째는 NDK 설치 한 다음 local.properties 파일에 다음 코드를 추가하여 라이브러리를 작성하십시오.
ndk.dir=/your/ndk/directory
미리 건축 된 ICU 라이브러리는 디렉토리에 배치됩니다 ./sqlite3/src/main/jni/sqlite/icu_lib_[arch] , icu4c 교차 컴파일하는 방법에 대한 더 많은 정보를 얻으려면이 프로젝트를 확인하십시오.
기본 라이브러리로드 :
System . loadLibrary ( "sqliteX" ); android.database.sqlite 네임 스페이스를 org.sqlite.database.sqlite 로 교체하십시오. 예를 들어 다음은 다음과 같습니다.
import android . database . sqlite . SQLiteDatabase ;다음으로 교체해야합니다.
import org . sqlite . database . sqlite . SQLiteDatabase ;자세한 내용은이 주제를 읽으십시오.
FTS3 및 FTS4는 사용자가 문서 세트에서 전체 텍스트 검색을 수행 할 수있는 SQLITE 가상 테이블 모듈입니다.
우리는 FTS3 및 FTS4 사용하여 전체 텍스트 검색을 수행하고 icu 수행하여 SQLITE에서 multi-language words segmentation 수행합니다.
다음 코드는 FTS 및 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 (); binary operators 사용하여 논리 검색을 수행하고 보조 기능을 결합하여보다 복잡한 검색을 수행 할 수 있습니다. 자세한 내용은 문서를 읽으십시오.
SQLITE는 런타임에 확장 기능 (새로운 애플리케이션 정의 된 SQL 기능, 컴퓨팅 시퀀스, 가상 테이블 및 VFSE 포함)을로드하는 기능이 있습니다. 이 기능을 사용하면 확장 프로그램이 응용 프로그램과 별도로 개발되고 테스트 될 수 있습니다.
기본적으로 SQLITE 확장은 특정 함수 세트를 구현하고 동적으로 SQLITE에로드 할 수있는 "플러그인"입니다.
다음 코드는 확장 로딩이 지원되는지 확인하는 방법을 보여줍니다.
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 );확장 로딩 활성화 또는 비활성화 :
// The following code CAN NOT run in a transaction
// Enable extension loading
db . enableLoadExtension ( true );
// Disable extension loading
db . enableLoadExtension ( false ); 활성화 된 후에는 지금 확장자를로드하고 spellfix 예로 들어 보겠습니다.
// 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 ));자신의 확장을 작성하는 것도 간단합니다.이 주제를 읽었는지 확인하십시오.
3 개의 내장 확장자, offsets_rank , okapi_bm25 및 spellfix 가 있으며 소스 코드는 디렉토리 builtin_extensions 에 배치됩니다. 이 확장은 기본적으로 활성화되므로 다음 코드를 local.properties 파일에 추가하여 비활성화 할 수 있습니다.
useBuiltinExtensions=false
문서는 다음과 같이 말했습니다.
이 Spellfix1 가상 테이블은 대형 어휘를 검색하여 가까운 경기를 위해 사용될 수 있습니다. 예를 들어, SpellFix1을 사용하여 철자가 잘못된 단어에 대한 수정을 제안 할 수 있습니다. 또는 FTS4와 함께 사용하여 잠재적으로 잘못된 단어를 사용하여 전체 텍스트 검색을 수행 할 수 있습니다.
여기에서 최신 소스 코드를 다운로드 할 수 있습니다.
빠른 모양 :
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
frustate자세한 내용은 여기에서 찾을 수 있습니다.
FTS 일치의 간단한 관련성을 계산하기 위해 함수 오프셋 ()과 함께 사용할 확장. 반환 된 값은 관련성 점수입니다 (실제 값은 0 이상 또는 동일)입니다. 더 큰 값은 더 관련성있는 문서를 나타냅니다.
함수 offsets() 에 의해 반환 된 값에 따르면, 각 항에 대해 4 정수 값을 포함하고, 마지막 값은 바이트의 일치 항의 크기이며, 일반적으로 값은 주어진 용어와 동일하게 유지되지만 예를 들어 옵션 토큰 화 = Porter가있는 FTS 테이블을 생성 할 때 다음 레코드를 포함합니다.
docid content
------ -------
1 sleep
2 sleeping
쿼리를 실행할 때 :
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleeping ' ;
SELECT docid, content, offsets(fts) FROM fts WHERE fts MATCH ' sleep ' ;똑같은 결과를 얻을 수 있습니다.
docid content offsets
------ ------- -------
1 sleep 0 0 0 5
2 sleeping 0 0 0 8
그러나 우리는 sleeping 검색 할 때 레코드 sleeping 에서 더 높은 점수를 원합니다. 기능 offsets_rank 함수 offsets 으로 반환 된 값을 구문 분석하고 관련성 점수를 조정합니다. 다음 쿼리는 가장 관련성이 가장 적은 전체 텍스트 쿼리와 일치하는 문서를 반환합니다.
SELECT docid, content FROM fts WHERE fts MATCH ' sleeping '
ORDER BY offsets_rank(offsets(fts)) DESC ;결과는 다음과 같습니다.
docid content
------ --------
2 sleeping
1 sleep
이 파일은 MIT 라이센스에 따라 SQLITE-OKAPI-BM25의 포크입니다. 순위 기능은 내장 MatchInfo 함수를 사용하여 점수를 계산하는 데 필요한 데이터를 얻습니다. 사용하기 전에이 문서를 읽었는지 확인하십시오.
SQLITE에 포함 된 파일을 제외하고 다른 모든 파일은 MIT 라이센스 아래에 있습니다.