2011-07-01 21 views
3

単純なSQLite FTS3実装では、現在、ユーザークエリが保存された結果と一致し、これらの結果にユーザークエリのすべての単語が含まれている限り返されます(つまり、FTSテーブルは簡単なトークナイザ)。SQLiteで部分一致を含むFTS3検索

ここでは、結果に一致するクエリの単語数に基づいて検索結果のランク付け/並べ替えを行いたいと思っています。現在

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 

を返す必要が返す例えば、

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

。言い換えれば、検索結果は必ずしもすべての単語のユーザクエリを含む結果に限定されるべきではなく、部分的に一致する結果を得るための余地を作りながら、リスト内のすべての単語を上位に含む結果を配置するべきである。

これを行う簡単な方法の1つは、ユーザーの入力のすべての順列を使用して複数のクエリを実行し、結果を必要な順序で結合することですが、それはむしろ非効率的です。

答えて

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' 

複数のクエリを処理する必要はありません。

関連する問題