2014-12-19 72 views
8

我已經integrated search based on the official Android documentation和 我使用SQLite的如下架構和查詢:如何用SQLite的FTS3實現模糊搜索?

CREATE VIRTUAL TABLE Search USING FTS3 (
    _id, 
    name, 
    location 
); 

select * from Search where name MATCH ? 
-- where ? is the user typed exact "query" 
-- or if it doesn't have spaces or stars I append a star to search prefix: "query*" 

我不知道我怎麼能延長嗎?允許以下:

說我有一些被命名的項目:

  • 我的花式項目
  • 我的祕密項目
  • 項目#1
  • 你看中的項目

當用戶在搜索框中鍵入blah搜索結果將顯示:

  • my
    • 花式項目
    • 祕密項目
  • mfi
    • 中號Ÿ˚F ancy TEM
  • fan itemfanitfit
    • CY EM
    • CY EM
  • ititemimitm
    • 我的幻想
    • 我的祕密 TE
    • #1
    • 你看中的

結果應該根據比賽有多好,例如,如果字母是更遠排名他們應該排名低於完全匹配,比如mfi:「我的花式項目」應該排在最後,「MFI thingy」應該排在第一位(如果有這樣的項目)。

注意:我的min SDK是API級別10,其中means it has to work SQLite 3.6.22

類似的功能,可以主要分佈在集成開發環境:

+0

沒有一種方法可以實現模糊搜索。你的要求太模糊,不能提出正確的答案。 – wvdz 2014-12-19 10:40:20

+1

'* l * i * k * e * t * h * i * s *'...但我確實擔心此解決方案的效率 – Selvin 2014-12-19 10:41:17

+0

@popovitsj用戶輸入任何內容,如果它匹配顯示的名稱的某個部分結果。 – TWiStErRob 2014-12-19 10:41:28

回答

3

的SQLite的FTS可以只搜索整個單詞或單詞前綴。

這樣的模糊搜索沒有內置功能。 (以及Android數據庫API不允許您添加自定義的虛擬表實現)

+1

任何想法的替代品? – TWiStErRob 2014-12-19 10:54:49

1

我去我的放寬條件來搜索所有字開頭:

private static String fixQuery(String query) { 
    return query.trim().replaceAll("\\s+", "*") + "*"; 
} 

它工作得很好。沒有錯字,但使用時感覺很自然。

+0

你能解釋一下這是什麼嗎? – theGreenCabbage 2015-07-14 17:17:15

+0

@theGreenCabbage「search all words beginnings」,'\\ s +'regex表示「任何連續的空格」,所以'ab cd ef'將變成'ab * cd * ef *'和[參閱文檔'*'的含義]( https://sqlite.org/fts3.html#termprefix) – TWiStErRob 2015-07-14 18:07:39

+0

謝謝。我認爲這是一篇Python實現的模糊搜索的文章。我正在使用Laravel,並發現我可以簡單地使用範圍查詢來做到這一點。如果這不起作用,我會回到你的解決方案。謝謝。 – theGreenCabbage 2015-07-14 18:08:31