検索入力が「what is」であるとします。これは「それが何であれ」と一致し、正確なフレーズである「何か」も一致します。さて、並べ替えで正確なフレーズを最初に作るにはどうしたらいいですか?SQLite FTSの何かの前に正確なフレーズが最初にありますか?
私は昨日からこれについて考えてきましたが、私はいろいろな解決策を考え続けていますが、それぞれには何らかの形で独自の欠陥があります。ここで
はしかし、私の失敗したアプローチです(「何か」=入力を想定):SELECT snippet(fts), 1 as rank
FROM fts
WHERE body MATCH '"what is"'
UNION ALL
SELECT snippet(fts), 2 as rank
FROM fts
WHERE body MATCH 'what* NEAR/3 is*' -- 3 is arbitrary
ORDER BY rank
- 問題をこの1には、2つのSELECTが はとても重複があるでしょう相互に排他的ではないということです。
- ランク列とスニペット機能が異なるため、UNIONを使用できません(最初はSTART |何がENDですか、他にSTART |何| ENDSTART |は| ENDです)。
- this(前の質問)MATCHはORDER BY句では機能しません(結果のテーブル/選択が元のFTSテーブルではないため)。
SELECT snippet(fts) FROM fts WHERE rowId IN ( SELECT DISTINCT rowId FROM ( SELECT rowId, 1 as rank FROM fts WHERE body MATCH '"what is"' UNION ALL SELECT rowId, 2 as rank FROM fts WHERE body MATCH 'what* NEAR/3 is*' ORDER BY rank ) ) WHERE body MATCH 'what* NEAR/3 is*'
私はここでやっていることは次のとおりです:
は、ここに私の現在のソリューションです最も内側のSELECTで
- 、私は次のSELECTでソート
- をやっています私は重複を除外しています(これはまだスニペットを使用していないために機能します)
- 最後に、rowIdが2番目の場合にスニペットを選択しています選択します。
ここでの問題は、順序が完全になくなって、あなたが期待するように、ある:(
EDIT:。
私は(私はので、強化されたクエリ構文を使用していないアンドロイドにFTS4を使用していますAndroidが)ことをサポートしている場合、私はわからない
Q:Sqliteを全文検索のバージョンを使用していますか? – paulsm4
FTS4。また、私はAndroidを使用しています。 –