我想在sqlite的使用FTS3和執行未返回所需結果的查詢。這裏是查詢:match子句返回不正確的結果
select * from table1 where col1 MATCH 'rain';
該查詢返回包含文本COL1「應變」太多,我不想。我想這個查詢的確切副本:
select * from table1 where col1 like '% rain %';
任何建議/意見/幫助?
我想在sqlite的使用FTS3和執行未返回所需結果的查詢。這裏是查詢:match子句返回不正確的結果
select * from table1 where col1 MATCH 'rain';
該查詢返回包含文本COL1「應變」太多,我不想。我想這個查詢的確切副本:
select * from table1 where col1 like '% rain %';
任何建議/意見/幫助?
在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
爲什麼你得到這個結果我不能確定。您只應爲您發佈的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
數查詢將返回不同的值在原始數據上。當我在你的表上使用你的查詢時,它工作正常。它真的很奇怪。這裏是我在做什麼: 使用FTS4(身份證號碼,VAL文本)創建虛擬表table1_fts4; –
在嘗試進一步調查時,我發現了一個有趣的發現。我拿起fts4表上的查詢返回的一行,並且該行沒有被類似的操作符返回。該行中包含文字'(rain)'。現在像查詢一樣正常忽略它,因爲我們在雨前放置空格,如下所示:'%rain%',這樣就可以返回一個完整的單詞。 MATCH條款將(雨)當作雨。 :) –
我建議你在爲他人發帖提問,這些研究結果將看到他們讀書的問題;-) – 2012-09-02 18:08:22
謝謝Ludo的幫助和支持.. :) –