2011-01-06 8 views
5

SQLiteデータベースのテーブルを照会して、指定された単語セットに一致するテーブルのすべての行を返す必要があります。SQLite - 1つ以上の文字列を含むテキストフィールドを含む行を返す方法

より正確には、〜80,000レコードのデータベースがあります。フィールドの1つは、レコードあたり100〜200語程度のテキストフィールドです。私ができるようにしたいのは、200の単一単語キーワード( "apple"、 "orange"、 "pear"、...)のリストを取って、少なくとも1つを含むテーブルのすべてのレコードのセットを取得することです説明列にキーワード用語の

これを行うにはすぐに明白な方法は、このようなものである:

SELECT stuff FROM table 
WHERE (description LIKE '% apple %') or (description LIKE '% orange %') or ... 

私は200語を持っている場合、私は不器用であることを私には思える大きく、厄介な探して、SQL文で終わる、萌芽驚くべきことに処理に時間がかかりません。1000レコードにつき1秒以上です。

この回答はBetter performance for SQLite Select Statementに近いと思われ、結果としてインデックスを作成しましたが、http://www.sqlite.org/optoverview.htmlによると、LIKE演算子が%ワイルドカードの先頭に使用されている場合、sqliteは最適化を使用しません。

SQLのエキスパートではありませんが、私はこれをやっていると仮定しています。もっと経験豊富な人がこれを行うより賢明で、おそらくより効率的な方法を提案できるかどうか疑問に思っていましたか?

また、問題に使用できる優れた方法がありますか?

答えて

2

SQLite fulltext searchを使用すると、LIKE '%...%'というクエリより高速になります。私は、%で始まるクエリのインデックスを使用できるデータベースはないと思います。データベースがクエリの開始点を知らないかのようにインデックスを使用して検索することができないかのようです。

別のアプローチでは、キーワードを別のテーブルに置き、メインテーブルのどの行にどのキーワードがあるかについての情報を持つ中間テーブルを作成します。そのようにすべての関連する列を索引付けすると、非常に迅速に照会できます。

+0

問題を正確に解決していただきありがとうございます。私はリンクを見て、それは完璧に見えます。 – Sam

0

これはフルテキスト検索と同じ問題ですか?この場合、効率的に実行したい場合は、DBからこれらのフィールドへのインデックスを構築する助けが必要です。 SQLiteのフルテキスト検索を簡単に検索すると、this pageが得られます。

あなたが正しいと判断した解決策は、最悪の場合(つまり、文書が一致しない場合)、ドキュメントごとに最大200の正規表現マッチを行うことになります。インデックス手法を使用すると、検索速度が各ドキュメントのサイズに依存しないことになります。

+0

お返事ありがとうございました。 – Sam

0

Full Text Searchをご覧になりたいと思うかもしれません。それはGoogleの誰かがSQLiteに寄稿しました。説明:

はテーブルが 多くの大規模な文書が含まれている場合でも、ユーザーが効率的に 1つ以上の単語(以下、 「トークン」)を含むすべての行のため データベースを照会することができます。

関連する問題