我正在构建一个具有日历的应用程序,用户可以在其中注释事件。
日历对每个用户都是私有的,即用户A无法在用户B的日历上看到事件。
我想使用Zend Lucene索引日历事件,但我不确定如何做到这一点。
我可以让Lucene将所有事件编入索引,无论用户是什么 - 但是当搜索完成时,它会向另一个用户显示一个用户的事件,而这不是我想要的。
我认为创建一个独立于每个用户的索引并不是一个好主意,但我不知道如何:
有关如何执行此操作的任何想法/建议/指示?
答案 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来自会话,这肯定会有效。