Php Zend Lucene-如何为日历应用程序构建索引?

Php Zend Lucene-如何为日历应用程序构建索引?,php,zend-framework,lucene,indexing,zend-lucene,Php,Zend Framework,Lucene,Indexing,Zend Lucene,我正在构建一个应用程序,它有一个日历,用户可以在其中注释事件 日历对每个用户都是私有的,也就是说,用户A看不到用户B日历上的事件 我想使用Zend Lucene为日历事件编制索引,但我不确定如何做到这一点 我可以让Lucene将所有事件索引在一起,而不管用户是谁——但是当搜索完成时,它会向另一个用户显示一个用户的事件,而这不是我想要的 我不认为为每个用户创建专用索引是个好主意,但我不知道如何: 创建所有用户日历事件的通用索引 搜索完成后,强制结果仅显示属于执行搜索的用户的事件 关于如何做到这

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

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

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

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

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

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

关于如何做到这一点,有什么想法/建议/建议吗?

我没有尝试过,但可能会奏效

您可以在“用户ID”字段和“搜索事件”字段中索引必须在“用户ID”字段中搜索的ID短语,在您的情况下,编号为:

$query = new Zend_Search_Lucene_Search_Query_Phrase(array('333'), null, 'user_id');
$hits1 = $index->find($query);
这将在“用户id”字段中搜索“333”短语

我不确定这不会返回到你们所有的索引,像'3334','3335',。。。你必须试一试。 如果此返回给您所有其他结果(33343335,…),您可以设置只搜索“333”,但我将其留给您的研究:)

您可以在此处找到所需的全部内容:


在任何情况下,都可以将用户id存储在索引中。 当有人搜索事件时,您必须仅显示具有以下内容的结果:


索引中的用户id==会话中的用户id,这肯定会起作用。

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

首先,确保在构建索引时包含
user\u id
字段

请注意,对
用户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
接下来,在后端添加一个布尔子查询(以编程方式),强制所有结果包括查询字符串(用户的搜索输入)和该用户的
用户id

就在这里

现在,如果用户
123
搜索“约会”,Lucene将使搜索实际上类似于
约会和user_id=123

让我知道,如果有任何方法来改善这一点-很高兴讨论

    $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);