2017-01-24 9 views
0

FTS5テーブルを使用してSQLite3データベースの(価格)範囲を検索するにはどうすればよいですか?FTS5とMATCHの間でレコードを見つける方法?

これは強く簡単な例テーブルである:私は価格のキュウリを検索することができますどのように

SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price:20 OR price:40)'; 

CREATE VIRTUAL TABLE fruits USING fts5 (id, name, price); 
INSERT INTO fruits (id,name,price) VALUES (1, 'Apple with A', 5); 
INSERT INTO fruits (id,name,price) VALUES (2, 'Pineapple with B', 10); 
INSERT INTO fruits (id,name,price) VALUES (3, 'Cucumber with C', 20); 
INSERT INTO fruits (id,name,price) VALUES (4, 'Melon with D', 25); 
INSERT INTO fruits (id,name,price) VALUES (5, 'Kiwi with E', 30); 
INSERT INTO fruits (id,name,price) VALUES (6, 'Cucumber with F', 35); 
INSERT INTO fruits (id,name,price) VALUES (7, 'Cucumber with G', 40); 

次のコマンドは、キュウリのために期待される二つのレコード3と7を返します。範囲20〜40(上記の例ではレコード6を含む)?私は

SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price: BETWEEN 20 AND 40)'; 

または

SELECT * FROM fruits WHERE fruits MATCH 'name:Cucumber AND (price: BETWEEN 19 AND 41)'; 

でそれをしようとした場合、私はまったく結果(またはエラーメッセージ)を取得しません。 MATCHとBETWEENを1つのクエリで使用することはできませんか?


しかも: なぜコマンドが

SELECT * FROM fruits WHERE fruits MATCH 'name:C'; 

ないリターン1つのレコードのみ(ID:3)ではない3、図6、図7、 'キュウリ' でCを想定が発見されますあまりにも、Cの「C」だけでなく?

答えて

0

FTSテーブルはすべてをテキストとして保存します。 FTSテーブルにidpriceの列を持つことは理にかなっていません。

FTSテーブルの効率的なクエリは、単語の検索(および内部docidによる検索)のみです。

FTSテーブルはテーブルではなく、インデックスとして扱う必要があります。 「本物の」テーブル内の他のデータを保持し、そのテーブルの上に他のクエリを実行します。Cで始まる単語を検索するには

SELECT * 
FROM fruits 
WHERE id IN (SELECT docid 
      FROM fruits_fts 
      WHERE fruits_fts MATCH 'Cucumber') 
    AND price BETWEEN 20 AND 40; 

を、あなたはprefix searchを使用する必要があります。

関連する問題