2013-03-17 39 views
1

我需要找到任何特殊字符。如果我把它放在一個字的中間,SQLite的FTS比賽可以忽略它,如果它不存在,如:SQLite:哪個字符可以在一個字中用FTS匹配被忽略

Text Body: book's 

如果我的匹配字符串是「圖書」我需要的「一書的」結果.. 使用porter或簡單標記器沒有問題。

我嘗試了很多像這樣的字符:book!s,book?s,book | s,book,s,book:s ...,但是當通過匹配搜索'books'時,沒有返回這些結果。

我不明白,爲什麼?

我使用:無內容FTS4表,外部內容FTS4表,我的文字的身體在每個字多字,應該改變搜索時忽略它..

我不能改變比賽的查詢,因爲我做的不知道單詞中的特殊字符在哪裏。此外,我需要保留原始字長等於FTS索引字的長度以使用匹配信息或snippet();因此,我無法從文本正文中移除這些字符。

回答

1

默認分詞器不會忽略標點符號,而會將它們視爲分隔符。

所以文本正文或匹配字符串book's將最終成爲兩個單詞books。 這些永遠不會匹配像books這樣的單一作品。

要忽略像'這樣的字符,您必須install your own custom tokenizer

+0

我使用.net中的'System.Data.SQLite',所以我可以從C#編寫自定義標記器嗎?我對C或C++一無所知,所以該怎麼辦? 另一種方式,我可以像REGEXP函數從C#中覆蓋MATCH函數作爲SQLite函數嗎? – user2178696 2013-03-17 12:10:01

+0

'MATCH'已經是一個自定義函數,由FTS虛擬表實現。你必須學習C,或者聘請一個有能力的人。 – 2013-03-17 14:39:15

+0

謝謝..另外兩件事,1:是否有任何方法使用正則表達式與FTS或MATCH? 2:這是正確的方式來破解SQLite標記器,如果沒關係,如何解決我的問題?請參閱:http://sqlite.1065341.n5.nabble.com/FTS-simple-tokenizer-with-custom-delimeters-td43926.html – user2178696 2013-03-17 15:38:46

相關問題