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