2013-02-19 59 views
2

我在啓用FTS的SQLite數據庫上看到了一些奇怪的行爲。我有一個名爲fingerprints的表,其中包含名爲scan的列。掃描的條目是長字符串,如下所示:FTS3和FTS4匹配:, - 和_字符

00:13:10:d5:69:88_-58;0c:85:25:68:b4:30_-75;0c:85:25:68:b4:34_-76;0c:85:25:68:b4:33_-76;0c:85:25:68:b4:31_-76;0c:85:25:68:b4:35_-76;00:23:eb:ad:f6:00_-87; etc 

它表示MAC地址和信號強度。現在我想做的事情放在桌上字符串匹配,並嘗試以匹配實例的MAC地址:

SELECT _id FROM fingerprints WHERE scan MATCH "00:13:10:d5:69:88"; 

這將返回了很多沒有在它由於某種原因指定的字符串行。我會嘗試匹配的第二件事是

SELECT _id FROM fingerprints WHERE scan MATCH "00:13:10:d5:69:88_-58"; 

這將返回與之前相同的行,並且是完全錯誤的。

SQLite是否以任何特殊方式處理: _ -字符?

感謝

回答

3

你看到的是對FTS tokenizing your data效果。

全文搜索不適用於未處理的長字符串,它會將您的數據(和您的搜索字詞)拆分爲單詞並將它們單獨編入索引。默認標記器使用所有字母數字字符和代碼點> 128的所有字符作爲單詞,並將其餘字符(例如,如您看到的: _ -)用作單詞邊界。

換句話說,你的00:13:10:d5:69:88搜索將搜索包含詞語任何順序001310d56988行。

您可以驗證此行爲;

sqlite> CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple); 
sqlite> INSERT INTO simple VALUES('00:13:10:d5:69:88'); 
sqlite> SELECT * FROM simple WHERE simple MATCH '69:10'; 

-> 00:13:10:d5:69:88 

編輯:顯然SQLite是比我聰明的最初給它的信貸,您可以使用phrase queries (scroll down about a page from the link destination)查找單詞序列,這將解決您的問題。短語查詢被封閉在雙引號條款(「)的空間(或其他文字分隔符)分隔的序列指定。

sqlite> SELECT * FROM simple WHERE simple MATCH '"69:10"'; 

-> No match 

sqlite> SELECT * FROM simple WHERE simple MATCH '"69 88"'; 

-> 00:13:10:d5:69:88 

sqlite> SELECT * FROM simple WHERE simple MATCH '"69:88"'; 

-> 00:13:10:d5:69:88 
+0

謝謝,我想我應該考慮的是,即使只是爲了表現。在最初的問題,我解決了它,但不明白爲什麼。在問題中的查詢不起作用,但這個工程作品SELECT ID FROM指紋在哪裏掃描MATCH'「00:13:10:d5:69:88_-58」';(注意在雙引號周圍添加的單引號) – chopchop 2013-02-19 23:49:23

+0

@chopchop由於「短語查詢」而起作用。請考慮閱讀由答案作者提供的鏈接,這非常有幫助。 – 2014-01-06 10:26:04