2016-12-16 3 views
1

仮想テーブル内のインデックス付きカラムのAND文を使用してクエリを実行しても、SQLiteでFTS3/4のメリットを享受することは可能ですか?例:FTSクエリでAND文を使用できますか?

SELECT title, ID, creationDate FROM documents WHERE type=1 AND status=2 AND searchableFields MATCHES '"john doe"'; 

または列タイプ状態は、仮想テーブルにインデックスが作成され

SELECT title, ID, creationDate FROM documents WHERE type=1 AND status=2 AND searchableFields CONTAINS 'john doe'; 

答えて

2

FTSテーブルのすべての列はテキスト列で、FTSインデックス付きです。 documentationは言う:

列名を明示的にデータ型の名前は、必要に応じて、各列に指定することができる、CREATE VIRTUAL TABLE文の一部としてFTSテーブルのために提供されている場合。これは純粋な構文的な砂糖です。提供されたtypenameは、FTSまたはSQLiteコアでは使用されません。

あなたはFTSテーブルの上にtype=1のような検索を行うべきではありません。ROWIDによって

  • 問合せ:

    FTSテーブルが2つの異なる形式のSELECT文を使用して効率的に照会することができます。 SELECT文のWHERE句に "rowid =?"という形式のサブ句が含まれている場合、 SQL式である場合、FTSはSQLite INTEGER PRIMARY KEYインデックスに相当するものを使用して、要求された行を直接取得できます。

  • フルテキストクエリ。 SELECTステートメントのWHERE句に "MATCH?"という形式のサブクエリが含まれている場合、FTSはビルトインフルテキストインデックスを使用して、フルテキストクエリ文字列と一致するドキュメントに検索を制限できますMATCH句の右オペランドとして指定します。

これら2つのクエリ方法のどちらも使用できない場合、FTSテーブルのすべてのクエリは、テーブル全体のリニアスキャンを使用して実装されます。テーブルに大量のデータが含まれている場合、これは実用的ではない可能性があります。

FTSテーブルをテーブルとして考えるのではなく、インデックスとして考えるべきです。あなたは非テキストデータを保存する場合

、あなたは別の、通常のテーブルを使用して、別々に問い合わせる必要があります。

SELECT title, ID, creationDate 
FROM documents 
WHERE type=1 
    AND status=2 
    AND ID IN (SELECT docid 
      FROM documents_FTS 
      WHERE searchableFields MATCH '"john doe"'); 

あなたはcontentless or external content tablesを使用することができ、二回同じデータを保存しないようにします。

+0

答えをありがとう、これは私が探していたものです!答えとしてマークする前に、そのクエリを変更してdocidsのサブセットのみを含むようにする方法を教えてください。例えば、50-100の間のdocidsです。私が尋ねる理由は、スクロール可能なリストを作成して、一度に50行程度しかロードしないことです。ありがとう! – user3367265

+0

これはまったく別の問題です。 –

+0

私は別の質問を投稿して、これについて正しい答えを与えた後、あなたがそれについて私を助けることができると思いますか、私はあなたにも正しい回答を与えますか?ありがとう! – user3367265

関連する問題