โครงการนี้ถูกคัดลอกและแก้ไขจากการผูก Sqlite Android เพื่อรองรับ การโหลดส่วนขยาย การค้นหาข้อความแบบเต็ม และ การแบ่งส่วนคำหลายภาษา โปรดอ่านเอกสารการเชื่อมโยง SQLite Android สำหรับข้อมูลเพิ่มเติม
รายละเอียดต่อไปนี้ที่คุณควรทราบก่อนใช้งาน:
version 3.17.0armeabi-v7a และ arm64-v8a โครงการนี้ให้เครื่องมือในการทำงานในบรรทัดคำสั่ง, Unix-like OS เท่านั้นเรียกใช้คำสั่งต่อไปนี้เพื่อ BUID:
$ cd / < your-project-dir > /host
$ chmod +x build.sh
$ ./build.sh ตอนนี้คุณจะพบไฟล์ที่เรียกใช้งานชื่อ sqlite3 และ 3 ส่วนขยาย 3 ในไดเรกทอรี ./out out เรียกใช้คำสั่งต่อไปนี้ในบรรทัดคำสั่งของคุณเพื่อตรวจสอบว่าใช้งานได้หรือไม่:
$ 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 ตรวจสอบไฟล์ build.sh เพื่อค้นหาตัวเลือกการรวบรวมมีอีกมากมายที่คุณอาจต้องการทราบโปรดอ่านหัวข้อนี้: วิธีรวบรวม SQLite
ทั้งหมดแรกโปรดตรวจสอบให้แน่ใจว่าคุณติดตั้ง NDK จากนั้นเพิ่มรหัสต่อไปนี้ลงในไฟล์ local.properties ของคุณเพื่อสร้างไลบรารี:
ndk.dir=/your/ndk/directory
ไลบรารี ICU Prebuilt ถูกวางไว้ในไดเรกทอรี ./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 เพื่อทำการ multi-language words segmentation ใน SQLite
รหัสต่อไปนี้แสดงวิธีใช้ 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 ที่กำหนดโดยแอปพลิเคชันใหม่ลำดับการเรียงลำดับตารางเสมือนและ VFSEs) ในเวลาทำงาน คุณลักษณะนี้ช่วยให้รหัสสำหรับส่วนขยายได้รับการพัฒนาและทดสอบแยกต่างหากจากแอปพลิเคชันจากนั้นโหลดบนพื้นฐานที่จำเป็น
โดยทั่วไปส่วนขยาย 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 ค่าที่ส่งคืนคือคะแนนความเกี่ยวข้อง (ค่าจริงมากกว่าหรือเท่ากับศูนย์) ค่าที่ใหญ่กว่าหมายถึงเอกสารที่เกี่ยวข้องมากขึ้น
ตามค่าที่ส่งคืนโดยฟังก์ offsets() มันมีค่าจำนวนเต็ม 4 ค่าในแต่ละเทอมค่าสุดท้ายคือขนาดของคำที่ตรงกันในไบต์โดยทั่วไปค่าจะเก็บค่าเดียวกันกับคำที่กำหนด แต่ในบางกรณีตัวอย่างเช่นเมื่อสร้างตาราง FTS ที่มีตัวเลือก tokenize = porter
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
ไฟล์นี้เป็นส้อมจาก Sqlite-okapi-BM25 ซึ่งอยู่ภายใต้ใบอนุญาต MIT ฟังก์ชั่นการจัดอันดับใช้ฟังก์ชั่น MatchInfo ในตัวเพื่อรับข้อมูลที่จำเป็นในการคำนวณคะแนน ตรวจสอบให้แน่ใจว่าคุณได้อ่านเอกสารเหล่านี้ก่อนใช้งาน
ยกเว้นไฟล์ที่รวมอยู่ใน SQLite ไฟล์อื่น ๆ ทั้งหมดอยู่ภายใต้ใบอนุญาต MIT