2011-07-01 53 views
3

我簡單的SQLite FTS3實現當前匹配與存儲結果用戶查詢,並且只要這些結果包含在用戶查詢中的所有單詞返回它們(換句話說,該FTS表是使用一個創建簡單分詞器)。包括SQLite中FTS3搜索部分匹配

現在,我想使搜索在該更聰明,我想它的排名基於在匹配結果查詢詞的數量/訂單的結果。例如,

SELECT name FROM nametable WHERE name MATCH 'fast food restaurant' 

目前返回

SUBWAY FAST FOOD RESTAURANT 
MCDONALDS FAST FOOD RESTAURANT 

應該按照這個順序返回

SUBWAY FAST FOOD RESTAURANT 
MCDONALDS FAST FOOD RESTAURANT 
CHIPOTLE FAST FOOD 
PIZZA FAST FOOD 
GOOD FOOD OUTLET 

。換言之,搜索輸出不應該侷限於這必然包含用戶的查詢,而是包含了較高的列表中的所有單詞而返回部分匹配結果騰出地方結果的所有單詞的結果。這樣做的

一個簡單的方法是運行使用用戶的所需順序輸入和UNION結果的所有排列多個查詢,但是這將是相當低效。

回答

3

這是一個未經測試的想法。

SELECT name 
FROM (
     SELECT name, 1 as matched 
     FROM nametable 
     WHERE name MATCH 'fast' 
    UNION ALL 
     SELECT name, 1 as matched 
     FROM nametable 
     WHERE name MATCH 'food' 
    UNION ALL 
     SELECT name, 1 as matched 
     FROM nametable 
     WHERE name MATCH 'restaurant' 
) 
GROUP BY name 
ORDER BY SUM(matched) DESC, name 
+0

按照需要工作。比我原先建議的所有排列組合方法更智能的解決方案。除非有更原生的解決方案,否則我想你的答案最能滿足我的需求。謝謝。 – gc20

4

更容易只是做:

SELECT name FROM nametable WHERE name MATCH 'fast OR food OR restaurant' 

無需處理多個查詢。