10

大きなテーブルで部分文字列検索を実行する必要がある Android アプリケーションを開発しています (通りと場所の名前を含む約 500,000 エントリ、エントリごとに数単語)。

CREATE TABLE Elements (elementID INTEGER, type INTEGER, name TEXT, data BLOB)

「名前」列に文字列が含まれているエントリは、全エントリの 20% のみであることに注意してください。

次のクエリの実行には、約 2 分かかります。

SELECT elementID, name FROM Elements WHERE name LIKE %foo%

クエリを高速化するために、FTS3 を使用しようとしました。これは大成功で、クエリ時間は 1 分に短縮されました (驚いたことに、データベース ファイルのサイズはわずか 5% しか増加しませんでした。これも私の目的には十分です)。

問題は、FTS3 が部分文字列検索をサポートしていないように見えることです。つまり、"foo bar" と "foobar" で "bar" を検索したい場合、両方の結果が必要なのに、"foo bar" しか取得できません。

だから実際には2つの質問があります:

  1. クエリをさらに高速化することは可能ですか? 私の目標はクエリの 30 秒ですが、それが現実的かどうかはわかりません...

  2. FTS3 を使用して実際の部分文字列検索を取得するにはどうすればよいですか?

4

4 に答える 4

3

nameデータベースの列にインデックスを追加する必要があります。これにより、クエリが大幅に高速化されます。

SQLite3 は、次のような部分文字列の一致をサポートしていると思います。

SELECT * FROM Elements WHERE name MATCH '*foo*';

http://www.sqlite.org/fts3.html#section_3

于 2012-07-04T20:48:22.950 に答える
0

私はあなたの問題に似たものに直面しています。すべての単語を数字に変換する変換テーブルを作成してみてください。次に、単語の代わりに数字を検索します。

これが役立つかどうか教えてください。

于 2013-04-03T21:18:25.793 に答える
-1

sqlliteを使用しているため、速度を上げるかどうかはわかりませんが、部分文字列検索では、次のようなことを行いました。

SET @foo_bar = 'foo bar'
SELECT * FROM table WHERE name LIKE '%' + REPLACE(@foo_bar, ' ', '%') + '%'

もちろん、これは「bar」という単語の前に「foo」という単語があるレコードのみを返します。

于 2012-07-04T20:06:08.847 に答える