Zend Lucene - 如何为Calendar应用程序构建索引?

时间:2011-12-02 02:42:26

标签: php zend-framework lucene indexing zend-lucene

我正在构建一个具有日历的应用程序,用户可以在其中注释事件。

日历对每个用户都是私有的,即用户A无法在用户B的日历上看到事件。

我想使用Zend Lucene索引日历事件,但我不确定如何做到这一点。

我可以让Lucene将所有事件编入索引,无论用户是什么 - 但是当搜索完成时,它会向另一个用户显示一个用户的事件,而这不是我想要的。

我认为创建一个独立于每个用户的索引并不是一个好主意,但我不知道如何:

  • 为所有用户创建日历事件的公共索引
  • 搜索完成后,强制结果仅显示属于执行搜索的用户的事件

有关如何执行此操作的任何想法/建议/指示?

2 个答案:

答案 0 :(得分:1)

以下是我解决这个问题的方法:

首先,确保在构建索引时包含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 < / em>的

    $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

让我知道是否有任何方法可以改善这一点 - 很高兴讨论。

答案 1 :(得分: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'短语。

我不确定这不会归还给你所有索引的'333'号码,如'3334','3335',......你必须尝试。 如果这返回给你所有其他结果(3334,3335,...),你可以设置你只想搜索'333',但我把它留给你的研究:)

您可以在此处找到所需内容:Zend_Search


在任何情况下,您都可以在索引中存储user_id。 与某人搜索事件相比,您必须仅显示具有以下结果的结果:

来自index == user_id的user_id来自会话,这肯定会有效。