2

ユーザーがイベントに注釈を付けることができるカレンダーを備えたアプリを作成しています。

カレンダーは各ユーザー専用です。つまり、ユーザーAはユーザーBのカレンダーのイベントを表示できません。

Zend Luceneを使用してカレンダーイベントのインデックスを作成したいのですが、これを行う方法がわかりません。

Luceneに、ユーザーに関係なくすべてのイベントのインデックスを作成させることもできますが、検索が実行されると、あるユーザーから別のユーザーへのイベントが表示されます。これは私が望んでいることではありません。

各ユーザー専用のインデックスを作成するのは良い考えではないと思いますが、次の方法は考えられません。

  • すべてのユーザーからのカレンダーイベントの共通インデックスを作成します
  • 検索が実行されると、検索を実行しているユーザーに属するイベントのみを結果に表示するように強制します

これを行う方法に関するアイデア/提案/ポインタはありますか?

4

2 に答える 2

1

この問題を解決した方法は次のとおりです。

まず、user_idインデックスを作成するときにフィールドを含めるようにしてください

Luceneにこのデータを検索して結果に表示させたいので、を使用Keyword()するのが賢明であることに注意してください。user_id

    $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が「予定」を検索すると、Luceneは実際に検索をのようにしappointment AND user_id=123ます。

これを改善する方法があるかどうか教えてください-話し合ってうれしいです。

于 2011-12-02T14:33:15.737 に答える
0

私はこれを試しませんでしたが、おそらくうまくいくでしょう。

user_idフィールドにIDをインデックス付けし、「user_id」フィールドに検索されたフレーズ(この場合は番号)が必要な検索イベントを作成できます。

$query = new Zend_Search_Lucene_Search_Query_Phrase(array('333'), null, 'user_id');
$hits1 = $index->find($query);

これにより、「user_id」フィールドで「333」フレーズが検索されます。

これが、「3334」、「3335」などの「333」番号のすべてのインデックスに戻らないかどうかはわかりません...試してみる必要があります。これで他のすべての結果(3334、3335、...)が返される場合は、「333」のみを検索するように設定できますが、調査はお任せします:)

ここで必要なものをすべて見つけることができます: Zend_Search


いずれの場合も、user_idをインデックスに保存できます。誰かがイベントを検索するときよりも、次のような結果のみを表示する必要があります。

インデックスからのuser_id==セッションからのuser_id、これは確実に機能します。

于 2011-12-02T09:01:20.657 に答える