5

最新のSQLite3.7.15.2シェル(Win32)をダウンロードし、http://sqlite.org/fts3.html#section_3に記述されているとおりにFTSの例の1つを実行しようとしました

-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3();

-- Virtual table data
INSERT INTO docs(docid, content) VALUES(1, 'a database is a software system');
INSERT INTO docs(docid, content) VALUES(2, 'sqlite is a software system');
INSERT INTO docs(docid, content) VALUES(3, 'sqlite is a database');

-- Return the set of documents that contain the term "sqlite", and the
-- term "database". This query will return the document with docid 3 only.
SELECT * FROM docs WHERE docs MATCH 'sqlite AND database';

しかし、最後のコメントにもかかわらず、SELECTは空のセットになりました。それはSQLiteのバグですか、それとも単に古いドキュメントですか?(そしてそのための正しい構文は何ですか?)

私にとって最も重要なのはそのクエリです

SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';

どちらも機能せず、アプリで必要なそのタイプのクエリ。それが機能するようにそれを書く他の方法はありますか?

4

3 に答える 3

3

それがドキュメントなのか、SQLiteのバグなのかはわかりませんが、いくつかの選択肢があります。

ANDクエリの場合

動作しません:

select * from docs where docs match 'sqlite AND database';

動作(暗黙を使用AND):

select * from docs where docs match 'sqlite database';

OR動作するようです:

select * from docs where docs match 'sqlite OR database';

OR+NEARクエリの場合:

動作しません:

SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';

作品:

SELECT * FROM docs WHERE docs MATCH 'database NEAR/5 system'
UNION
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR/5 system'

編集:コメントに記載されているフォームの場合 (word11 OR word12 OR word13) NEAR/2 (word21 OR word22 OR word23) NEAR/2 (word31 OR word32 OR word33。これが私にできる最善のことは、すべての組み合わせをUNIONと組み合わせることです。

SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word21 NEAR/2 word31'
UNION
SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word22 NEAR/2 word32'
UNION
SELECT * FROM docs WHERE docs MATCH 'word11 NEAR/2 word23 NEAR/2 word33'
UNION
SELECT * FROM docs WHERE docs MATCH 'word12 NEAR/2 word21 NEAR/2 word31'
...

もちろん、上記は大量のSQLを作成します。語尾のみが異なるという点で単語が類似している場合は、ワイルドカードを使用できます。

SELECT * FROM docs WHERE docs MATCH 'word1* NEAR/2 word2* NEAR/2 word3*';
于 2013-02-02T14:36:30.910 に答える
3

ドキュメントの例では、拡張クエリ構文を使用しています。PRAGMA compile_options;を含むことを確認してくださいENABLE_FTS3_PARENTHESIS

クエリが機能しないことNEARは、コンパイルオプションの問題ではありません。

> SELECT * FROM docs WHERE docs MATCH '(database OR sqlite) NEAR/5 system';
Error: malformed MATCH expression: [(database OR sqlite) NEAR/5 system]

問題は、ドキュメントによると、NEAR基本的な検索式でのみ機能することです。

NEARクエリは、キーワード「NEAR」を2つのフレーズ、用語、またはプレフィックスクエリの間に置くことで指定されます。

したがって、それに応じて検索式を書き直す必要があります。

> SELECT * FROM docs WHERE docs MATCH '(database NEAR/5 system) OR (sqlite NEAR/5 system)';
a database is a software system
sqlite is a software system
于 2013-02-02T21:05:40.210 に答える
0

ドキュメント(https://www.sqlite.org/fts3.html)によると、括弧はデフォルトではサポートされていません。

パート2をご覧ください。FTS3とFTS4のコンパイルと有効化

于 2020-10-20T22:53:39.470 に答える