查询类型单项查询单项查询用于搜索一个搜索项。 两种搜索方式都可以用于单项查询。 查询字串: $hits = $index->find('word1'); 或者 通过 API 创建查询: <?php $term = new Zend_Search_Lucene_Index_Term('word1'); $query = new Zend_Search_Lucene_Search_Query_Term($term); $hits = $index->find($query); ?> 多项查询多项查询用于搜索一组搜索项。 每一个搜索项可以被定义为必须的、禁止的或者既不必须也不禁止(可选)的。
这意味着,如果一个包含必须的搜索项的查询中加入了可选的搜索项,返回的搜索结果集合是一样的,但是那些包含可选搜索项的搜索结果,将会上升到结果清单的前面。 两种搜索方式都可以用于单项查询。 查询字串: <?php $hits = $index->find('+word1 author:word2 -word3'); ?>
或者 通过 API 创建查询: <?php $query = new Zend_Search_Lucene_Search_Query_MultiTerm(); $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true); $query->addTerm(new Zend_Search_Lucene_Index_Term('word2'), null); $query->addTerm(new Zend_Search_Lucene_Index_Term('word3'), false); $hits = $index->find($query); ?>
短语查询短语查询用于搜索短语。 短语查询非常灵活,既可以搜索精确的短语,也可以搜索模糊的短语。精确短语可以包含搜索项和空隙(译注,所谓空隙也就是支持形如“word1 ... word2”的短语)。(可以使用分需程序生成以用于不同的用途。此外,搜索项可以被复制以提升该搜索项的权重或着一些同义词可以放在相同的地方。)因此目前短语查询只能通过 API 创建: <?php $query1 = new Zend_Search_Lucene_Search_Query_Phrase(); // Add 'word1' at 0 relative position. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word1')); // Add 'word2' at 1 relative position. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word2')); // Add 'word3' at 3 relative position. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word3'), 3); ... $query2 = new Zend_Search_Lucene_Search_Query_Phrase( array('word1', 'word2', 'word3'), array(0,1,3)); ... // Query without a gap. $query3 = new Zend_Search_Lucene_Search_Query_Phrase( array('word1', 'word2', 'word3')); ... $query4 = new Zend_Search_Lucene_Search_Query_Phrase( array('word1', 'word2'), array(0,1), 'annotation'); ?>
短语查询可以使用类的构造方法一次性创建,也可以使用
类 Zend_Search_Lucene_Search_Query_Phrase 的构造方法有三个可选的参数: Zend_Search_Lucene_Search_Query_Phrase([array $terms[, array $offsets[, string $field]]]);
因此: $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework')); <$query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'download'), array(0, 2)); $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'), null, 'title');
方法 Zend_Search_Lucene_Search_Query_Phrase::addTerm(Zend_Search_Lucene_Index_Term $term[, integer $position]);
因此: $query = new Zend_Search_Lucene_Search_Query_Phrase(); $query->addTerm(new Zend_Search_Lucene_Index_Term('zend')); $query->addTerm(new Zend_Search_Lucene_Index_Term('framework')); $query = new Zend_Search_Lucene_Search_Query_Phrase(); $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0); $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2); $query = new Zend_Search_Lucene_Search_Query_Phrase(); $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title')); $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title')); 模糊因子设置了查询短语中两个词之间允许出现的其它词的数量。如果是 0,那么这是一个精确短语搜索。如果是一个较大的值,那么这工作起来像是具有(WITHIN)或者附近(NEAR)操作。 模糊因子事实上是一个“编辑距离”,表示移动搜索项移动到查询短语以外的位置上相对应的移动单位。例如,交换两个词的顺序需要两次移动(一次把一个词放到另一个前面),因此要允许短语的重新排序,模糊因子至少必须为 2。 更精确的匹配相比更模糊的匹配得分更高,因此搜索结果将按照精确度排序。模糊因子默认为 0,也就是需要精确匹配。 模糊因子可以在查询创建后赋值: <?php // Query without a gap. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('word1', 'word2')); // Search for 'word1 word2', 'word1 ... word2' $query->setSlop(1); $hits1 = $index->find($query); // Search for 'word1 word2', 'word1 ... word2', // 'word1 ... ... word2', 'word2 word1' $query->setSlop(2); $hits2 = $index->find($query); ?>
|