2012-09-02 54 views
0

我想在sqlite的使用FTS3和執行未返回所需結果的查詢。這裏是查詢:match子句返回不正確的結果

select * from table1 where col1 MATCH 'rain'; 

該查詢返回包含文本COL1「應變」太多,我不想。我想這個查詢的確切副本:

select * from table1 where col1 like '% rain %'; 

任何建議/意見/幫助?

回答

0

在SQLite數據庫FTS3/FTS4的情況下,我的結論是默認標記生成器,其是簡單的(至少)忽略「(」和「)」,而標記化的元素任何文本列。其他特殊字符也可以檢查,因爲我懷疑會有其他人。當匹配查詢被執行時,這些值被忽略。下面是測試案例我的情況:

create virtual table tab1 using fts3(val text); 
insert into tab1 values('this is rain test'); 
insert into tab1 values('this is strain test'); 
insert into tab1 values('this is (rain) test with parenthesis'); 
insert into tab1 values('rain test'); 
insert into tab1 values('this is rain'); 
insert into tab1 values('strain test'); 
insert into tab1 values('this is strain'); 

執行以下查詢後:

select * from tab1 where val MATCH 'rain'; 

結果是:當我運行這兩個查詢

this is rain test 
this is (rain) test with parenthesis 
rain test 
this is rain 
+0

謝謝Ludo的幫助和支持.. :) –

0

爲什麼你得到這個結果我不能確定。您只應爲您發佈的MATCH查詢獲得匹配條件的結果。你能發表你的FTS3 CREATE TABLE聲明嗎?

例如:

SQLite version 3.7.11 2012-03-20 11:35:50 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> CREATE VIRTUAL TABLE mail USING fts3(subject, body); 
sqlite> INSERT INTO mail(docid, subject, body) VALUES(1, 'software feedback', 'found it too slow'); 
sqlite> INSERT INTO mail(docid, subject, body) VALUES(2, 'software feedback', 'no feedback'); 
sqlite> INSERT INTO mail(docid, subject, body) VALUES(3, 'slow lunch order', 'was a software problem'); 
sqlite> select * from mail where body match 'back'; 
sqlite> select * from mail where body match 'feedback'; 
software feedback|no feedback 
+0

數查詢將返回不同的值在原始數據上。當我在你的表上使用你的查詢時,它工作正常。它真的很奇怪。這裏是我在做什麼: 使用FTS4(身份證號碼,VAL文本)創建虛擬表table1_fts4; –

+0

在嘗試進一步調查時,我發現了一個有趣的發現。我拿起fts4表上的查詢返回的一行,並且該行沒有被類似的操作符返回。該行中包含文字'(rain)'。現在像查詢一樣正常忽略它,因爲我們在雨前放置空格,如下所示:'%rain%',這樣就可以返回一個完整的單詞。 MATCH條款將(雨)當作雨。 :) –

+0

我建議你在爲他人發帖提問,這些研究結果將看到他們讀書的問題;-) – 2012-09-02 18:08:22