新しい投稿がユーザーの定義したルールと一致したときに通知をトリガーするシステムを構築する必要があります。"逆ブール検索"または(ブールルール付き)キーワードでサブスクリプションを作成する最善の方法は何ですか?
など。 システムにはユーザーのリストがあります(何百万と言いましょう)。そして、追加された投稿のストリームがあります(また、大量)。
新しい投稿が自分が定義したルールに一致すると通知を受けたいユーザーもいます。
ルールは、どの単語を投稿に含めるべきかを記述するブール式です。
例えば、利用者Aは、以下のルールを定義:
をプログラミング 『または『コーディング』、という言葉含有してはならない『JavaScriptを』「私はすべての新しいポストは言葉が含まれている場合に通知されるようにしたい』
。疑似論理式:
notify = (post.contains("programming") OR post.contains("coding")) AND NOT (post.contains("javascript"))
上記のルールを持つユーザーは、このようなポストについて通知する必要があります。
は一方
「のpythonとベストプラクティスのプログラミング」、上記のルールを持つユーザーは、このようなものについて通知すべきではありません:「JavaScriptとnodejsによるプログラミングバックエンド」
*
それは "逆(ブーリアン)検索"(これをどのように名前を付けるか分かりません)のようなものです。
私が意味する、「直接」ブール検索では、ユーザーは、「プログラミングパイソン」ととパイソンが返されるプログラミングに一致するすべての記事と入力します。
しかし、私は反対を必要とします:ポストを提供、私はこの投稿と一致するユーザーを返す必要があります。
私が考えている1つの「ダンプ」ソリューションは、このためにElasticSearchを使用することです。 ElasticSearchでは、私はユーザーが定義したルール格納します : - > rules-(ブール値ルールのキーワード)、ユーザーB -
ユーザーA>ルールを...)
新しい投稿が作成されたは、ルールを使用していますこのポストの内容によってES内で検索されます(ブールルールが適用されていないルールでポストの単語の出現を検索するだけです)。
このように、私は可能なユーザをフィルタリング(削減)します。このステップで10000人のユーザーが見つかりました。
この新しい投稿はElasticSearch(別のインデックス)にも保存されます。
2番目の手順では、その1つの投稿に対してBULK検索リクエストをElasticSearch(msearch)インデックス(投稿インデックス)にします。
一括検索リクエストには10000個の検索クエリが含まれ、各クエリには個々のユーザーのブール値ルール(query-> boolean-> must ...など)が含まれます。
したがって、一致したルールを持つユーザーのみが通知されます。
このソリューションについてどう思いますか?私が知っているように、弾性検索はいくつかの限られた数の最初の文書を検索するだけで高速ですが、私は数千を検索する必要があります(最初の手順のために)。
多分、この問題のためのより良い適合が火花ですか? (それに精通していない、巨大な量のデータを処理できることを知っていて、このユースケースがsparkにうまく収まるかどうか疑問に思う)。
この問題を解決するにはどの方向を向けるべきですか?
ありがとうございました!ソリューションの
一つElasticSearch浸透クエリを使用することです。私は自分の質問に答えるよ