Zend Lucene-カレンダーアプリケーションのインデックスを構築する方法は?
-
27-10-2019 - |
質問
ユーザーがイベントに注釈を付けることができるカレンダーを備えたアプリを構築しています。
カレンダーは各ユーザーにとってプライベートです。つまり、ユーザーAはユーザーBのカレンダーでイベントを表示できません。
Zend Luceneを使用してカレンダーイベントにインデックスを付けたいと思いますが、これを行う方法はわかりません。
ユーザーに関係なく、Luceneがすべてのイベントを一緒にインデックスすることもできますが、検索が完了すると、あるユーザーのイベントが別のユーザーに表示されますが、それは私が望むものではありません。
各ユーザー専用のインデックスを作成することは良い考えではないと思いますが、アイデアから外れています。
- すべてのユーザーからカレンダーイベントの共通インデックスを作成する
- 検索が完了したら、検索を実行するユーザーに属するイベントのみを表示するように結果を強制します
これを行う方法に関するアイデア/提案/ポインターはありますか?
解決
これが私がこの問題を解決した方法です:
まず、必ず含めてください user_id
インデックスを構築するときのフィールド
使用するのが賢明であることに注意してください Keyword()
為に user_id
Luceneに検索と結果にこのデータを表示することを望んでいるためです。
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Keyword('user_id', $row->user_id));
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('date_1', $row->date_1));
$doc->addField(Zend_Search_Lucene_Field::Text('title', $row->title));
$index->addDocument($doc);
//etc
次に、バックエンドにブールサブクエリ(プログラム)を追加して、すべての結果にクエリ文字列(ユーザーの検索入力)とこのユーザーのものを含めるように強制します user_id
.
$index = Zend_Search_Lucene::open($this->search_index);
// add user's input to parser
$query = Zend_Search_Lucene_Search_QueryParser::parse($query_string);
// add boolean query
$query_bool = new Zend_Search_Lucene_Search_Query_Boolean();
// add user id as a term
// note this is saying that a specific `user_id`
// must be found in a specific field (user_id)
$user_id = get_user_id(); // or use your own 'get user id' function
$term = new Zend_Search_Lucene_Index_Term($user_id, 'user_id');
$subquery1 = new Zend_Search_Lucene_Search_Query_Term($term);
// construct boolean requiring both user id and string
$query_bool->addSubquery($query, true); // required
$query_bool->addSubquery($subquery1, true); // required
$query_result = $index->find($query_bool);
そして、あなたはそれを持っています。
ユーザーの場合 123
「予定」を検索すると、ルーセンは実際に検索を次のようにします appointment AND user_id=123
.
これを改善する方法があるかどうかを教えてください - 議論してうれしいです。
他のヒント
私はこれを試しませんでしたが、おそらくうまくいくでしょう。
「user_id」フィールド検索フレーズ(あなたの場合は次の場合)にある必要があるユーザー_IDフィールドと検索イベントでIDをインデックスできます。
$query = new Zend_Search_Lucene_Search_Query_Phrase(array('333'), null, 'user_id');
$hits1 = $index->find($query);
これにより、「user_id」フィールドで「333」というフレーズが検索されます。
これがすべてのインデックスホイット「333」の「3334」、「3335」などに戻らないかどうかはわかりません。これが他のすべての結果(3334、3335、...)に戻った場合、「333」のみを検索することを設定できますが、私はそれをあなたの研究に任せます:)
ここで必要なものをすべて見つけることができます: Zend_search
いずれにせよ、user_idをインデックスに保存できます。誰かがイベントを検索するときよりも、次の結果のみを表示する必要があります。
index == user_id from sessionのuser_id、これは確かに機能します。