【问题标题】:Zend Lucene - how to build an index for Calendar application?Zend Lucene - 如何为日历应用程序构建索引?
【发布时间】:2011-12-02 02:42:25
【问题描述】:

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

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

我想使用 Zend Lucene 索引日历事件,但我不确定如何执行此操作。

我可以让 Lucene 将所有事件一起索引,而不管用户是谁——但是当搜索完成后,它会将一个用户的事件显示给另一个用户,这不是我想要的。

我认为为每个用户创建一个专属索引不是一个好主意,但我不知道如何:

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

关于如何做到这一点的任何想法/建议/指示?

【问题讨论】:

    标签: php zend-framework lucene indexing zend-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

    如果有任何改进方法,请告诉我 - 很高兴讨论。

    【讨论】:

      【解决方案2】:

      我没有尝试过,但它可能会起作用。

      您可以在 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 存储在您的索引中。 当有人搜索事件时,您必须只显示具有以下内容的结果:

      来自索引的用户 ID == 来自会话的用户 ID,这肯定会起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        相关资源
        最近更新 更多