【问题标题】: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,这肯定会起作用。