2016-04-05 51 views
3

根據answer to another question,在sqlite中,Levenshtein距離是在一個名爲editdist3的SQL函數中實現的。 (也比較documentation如何在sqlite中使用editdist3

現在,當我嘗試使用它,我得到的是一個錯誤,它不存在:

╰┄┄> sqlite3 
SQLite version 3.11.1 2016-03-03 16:17:53 
Enter ".help" for usage hints. 
Connected to a transient in-memory database. 
Use ".open FILENAME" to reopen on a persistent database. 
sqlite> CREATE TABLE test (col1 TEXT); 
sqlite> INSERT INTO test VALUES ('foobar'); 
sqlite> SELECT * FROM test WHERE editdist3(col1, 'f00bar') < 3; 
Error: no such function: editdist3 

我使用的Gentoo Linux的sqlite-3.11.1 (默認)USE標誌icureadlinesecure-delete

回答

2

事實證明editdist3包含在必須顯式加載的sqlite擴展中。因爲我沒有在Gentoo sqlite包中找到它,所以我也必須自己構建它。正如documentation說:不包括在SQLite的合併

的spellfix1虛表,而不是任何標準的SQLite構建的一部分。這是一個可加載的 擴展名。

首先我拿來的源代碼

wget https://sqlite.org/2016/sqlite-src-3110100.zip 
unzip sqlite-src-3110100.zip 

那麼它必須被編譯

gcc -shared -fPIC -Wall -Isqlite-src-3110100 sqlite-src-3110100/ext/misc/spellfix.c -o spellfix.so 

,最後它可以與

.load ./spellfix 

注意,自動SQLite的加載附加分機.so。這是我的初衷 - -

在Python中使用它下面需要做的事情:

db = sqlite3.connect(':memory:') 

db.enable_load_extension(True) 
db.load_extension('./spellfix') 
db.enable_load_extension(False)