2013-04-18 20 views
2

我希望能夠在SQLite中使用FTS4搜索數字2.3,但是。正被視爲令牌邊界。寫一個完整的定製標記器沒有任何其他方式排除。從令牌邊界字符列表?如何停止。被視爲SQLite中的分隔符FTS4

能夠搜索十進制數似乎是一個常見用例,但我找不到與SO/Google相關的任何內容。目前我最好的解決辦法是全部取代。字符與字母,並相應地對每個搜索替代已知的(長)字符串文本...

彼得

回答

0

標記生成器定義標記是什麼,所以你的確需要自己編寫。

您可以搜索短語"2 3",它將使用任何分隔符查找數字2和3。

+0

嗨CL - 我想你是對的。我希望以前有人可能已經解決了這個問題,但我猜想在文本中搜索數字並不常見。我通過regexing(\ d +)\之前令牌化解決了我的目的。(\ d +),以$ 1XXUNIQUEPHRASEXX $ 2,做同樣的我的搜索文本。工作正常,但感覺uuuuguggglyly。事實上,由於本地化(和歐洲等),很難做到正確。感謝您的回覆 - 我很感激。 – Peter

5

您不需要編寫自己的標記器:某些內置標記器可以讓您在創建表時指定某些字符應該或不應該被視爲單詞字符。例如,unicode61標記器(請參閱FTS3 docs,您可能需要在構建時啓用對它的支持)才能讓您傳遞tokencharsseparators參數(在source中戳動)。

在你的情況,我相信你可以使用這樣的事情:

CREATE VIRTUAL TABLE whatever USING fts4(
    columns, 

    tokenize=unicode61 "tokenchars=." 
); 
6

其實你並不需要編寫自己的分詞器。

'簡單'分詞器允許定製分隔符,但它是一個未記錄的功能。

創建FTS表如下,和SQLite將令牌化的「」(空間)和「#」(井)中的字符:

CREATE VIRTUAL TABLE documents USING fts4(title, content, tokenize=simple '' '# '); 

有這個功能SQLite的郵件列表上的討論在2012年here。 支持此功能的SQLite中的源代碼是here。從郵件列表就其缺乏文檔

報價:

「有可能的原因是,我們忘記了這個功能,即使存在 似乎在簡單的分詞器已經存在了,不變的,因爲。早在2006年就引入了FTS1。「

關於是否是安全的使用功能引用:

「但它已經在代碼了這麼久,現在我們不敢改變 ,生怕打破長期形成的計劃。 「

...但也有人提到該功能不太可能經過徹底測試。

我剛剛通過電子郵件發送了SQLite用戶郵件列表,詢問是否可以記錄此功能。

更新:我要添加的一件事是,我們發現如果將諸如'*'或' - '的字符配置爲這樣的分隔符,那麼它們也將被剝離出在查詢中的FTS MATCH子句。所以雖然這對''很好。它不能用於FTS MATCH中也是特殊字符的字符。

+0

非常感謝這個答案。原始代碼已完成和部署,但下次我會嘗試您的建議:-) – Peter

相關問題