2011-12-02 28 views
2

我正在构建一个具有日历的应用,用户可以在其中注释事件。Zend Lucene - 如何构建Calendar应用程序的索引?

日历对每个用户都是私人的,也就是说,用户A无法看到用户B日历上的事件。

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

我能有Lucene索引的所有事件一起,无论用户 - 但后来当搜索完成后,它会显示一个用户的活动,其他的,这不是我想要的。

,我不认为这将是打造专属给每个用户的索引是个好主意,但我的想法如何:

  • 所有用户创建日历事件的一个共同指标
  • 当搜索完成后,力结果仅显示属于用户事件执行搜索

关于如何做到这一点任何意见/建议/指针?

回答

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添加一个布尔子查询。

$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

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

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”的所有指数丝毫“333”号,“3335”,......你一定要试试。 如果这给你返回所有其他结果(3334,3335,...),你可以设置你只想搜索'333',但我把它留给你的研究:)

你可以找到你所有的东西在这里需要:Zend_Search


在任何情况下,你可以在你的索引USER_ID存储。 比有人搜索事件,你必须显示只有结果有:

user_id从索引== user_id从会话,这将工作肯定。

相关问题