高速文字列照合アルゴリズムの簡単なワイルドカード支援
-
21-08-2019 - |
質問
い合わせ入力文字列(Url)に対して大きなセットから1k-250k)の文字列ルールの簡単なワイルドカードです。
要件は、ワイルドカード支援:
ワイルドカード(*)にのみの"部"はりましたが、修正いたしました。この断片のドメイン、パス、およびパラメータ。例えば、"*.ます。部品/*/できます。部=部部=*".唯一の例外はこのルールのパスが"/*"を一致させる必要があいた後にスラッシュ.
例:
- *.site.com/*--を一致させる必要があsub.site.com/home.html,sub2.site.com/path/home.html
- いたしません。サイトです。*/path/*--を一致させる必要があsub.site.com/path/home.html,sub.site.net/path/home.htmlがないsub.site.com/home.html
追加要件:
- 高速のルックアップ(I"の実現に向けた高速"が相対す。さらに最大250k規則は、まだ内 < 1.5s 可能な場合.)
- 仕事の範囲内に現代のデスクトップなどいないサーバーに実施)
- 能のとき0を返します:nマッチを与え入力文字列
- マッチしてルールのデータを添付してください
何が最良のシステム/アルゴリズムなどです。いす開発のソリューショC++のルール自体が保存されSQLiteデータベースです。
解決
、あなたはそれがURLだと同じように、文字列のルールを取り、ドメイン、パス、およびクエリの部分にそれを破ることができます。そして、あなたはそれらの作品のそれぞれに標準ワイルドカードマッチングアルゴリズムを適用することができますあなたがに対してテストするURLから該当する作品に対して。作品のすべてが一致した場合、ルールがマッチします。
例
Rule: *.site.com/* domain => *.site.com path => /* query => [empty] URL: sub.site.com/path/home.html domain => sub.site.com path => /path/home.html query => [empty] Matching process: domain => *.site.com matches sub.site.com? YES path => /* matches /path/home.html? YES query => [empty] matches [empty] YES Result: MATCHあなたは、データベース内のルールを格納していると、
私はすでに、これらの3つの部分に分割して格納します。あなたはユーバースピードをしたい場合、あなたは*
のに%
年代を変換し、あなたのためのマッチングを行うために、データベースのネイティブLIKE
操作を使用することができます。次に、あなただけのようなクエリがあると思います。
SELECT *
FROM ruleTable
WHERE @urlDomain LIKE ruleDomain
AND @urlPath LIKE rulePath
AND @urlQuery LIKE ruleQuery
ここで@urlDomain
、@urlPath
、および@urlQuery
は、プリペアドステートメント内の変数です。何も一致しない場合、クエリはURL、または空の結果セットに一致するルールを返します。
他のヒント
まず第一に、あなたが行うことができます最悪の検索を実行するのは、文字列の両端にワイルドカードである「の.domain.com /パスの」 - と私はあなたが行っていると思いますこのような場合をたくさんヒットします。 com.domain.example /のpath1 /パス2 / page.html:だから私の最初の勧告は、彼らはあなたのDBに格納されているようドメインの順序を逆にすることです。それはあなたがはるかにきちんと物事を保つだけではかなり高速検索を提供する文字列、上の「一方向」にワイルドカードを使用できるようになります。
私はジョンがすべてのあなたのDB内にこれを行う方法についていくつかの良い点を挙げ思います。それが動作しない場合、私は、リストに対してC ++で正規表現ライブラリを使用します。私はあなたがそのように最高のパフォーマンスと最も一般的な正規表現の構文を取得します賭けます。