1

私は、ユーザーが特定の時間枠で特定のページのセットを特定の順序で閲覧するたびに検出できるJavaベースのWebサーバーモニターアプリケーションを作成しています。この目的のために、私はエスパーライブラリーを使用しています。クエリの最適な定式化について疑問があります。

最初に、Webサーバーに到達するHTTPリクエストのすべての情報を格納するために使用される「Access」オブジェクトを宣言しました。サーバーに新しい要求が発行されるたびに、新しいAccessオブジェクトがインスタンス化され、イベントとしてEPL処理コアに送信されます。

ページA、ページB、次にページCを閲覧するすべてのユーザーを追跡したいとします。このようなケースに対処するための最適なアプローチはどれですか。次の例のように、遷移ごとに1つずつ、複数の結合を実行する必要がありますか?

select * from Access(request='GET /A HTTP/1.1').win:time(30 sec) as a1,
Access(request='GET /B HTTP/1.1').win:time(30 sec) as a2, 
Access(request='GET /C HTTP/1.1').win:time(30 sec) as a3
where a1.IP=a2.IP AND a2.IP=a3.IP
4

2 に答える 2

0

順序が定義されていない場合、つまりユーザーがA / B / Cを任意の順序で参照できる場合は、結合を使用します。

パターン(EPLまたは正規表現ベースの一致認識)を使用して、特定の順序を検出します。

于 2012-11-28T15:49:50.577 に答える
0
select * from pattern[ every
    a=pageA ->
    b=pageB(a.IP=b.IP) ->
    c=pageC(a.IP=b.IP and c.IP=b.IP) within timer.interval(30s)];

特定の順序で取得したい場合は、これが役立つことを願っています。

于 2012-11-29T05:39:39.750 に答える