我正在使用Zend Lucene搜索:
......
$results = $test->fetchAll();
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
foreach ($results as $result) {
$doc = new Zend_Search_Lucene_Document();
// add Fields
$doc->addField(
Zend_Search_Lucene_Field::Text('testid', $result->id));
$doc->addField(
Zend_Search_Lucene_Field::Keyword('testemail', strtolower(($result->email))));
$doc->addField(
Zend_Search_Lucene_Field::Text('testconfirmdate', $result->confirmdate));
$doc->addField(
Zend_Search_Lucene_Field::Text('testcreateddate', $result->createddate));
// Add document to the index
$index->addDocument($doc);
}
// Optimize index.
$index->optimize();
// Search by query
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
if(strlen($Data['name']) > 2){
//$query = Zend_Search_Lucene_Search_QueryParser::parse($Data['name'].'*');
$pattern = new Zend_Search_Lucene_Index_Term($Data['name'].'*');
$query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
$this->view->hits = $index->find(strtolower($query));
}
else{
$query = $Data['name'];
$this->view->hits = $index->find($query);
}
............
在这里可以正常工作:
- 当我给出完整的单词,前3个字符,不区分大小写的单词
我的问题是:
- 当我搜索电子邮件时,我得到了错误,如"
Wildcard search is supported only for non-multiple word terms
" - 当我搜索数字/日期如"
1234
"或09/06/2011
时,我得到错误,如"在模式开始时至少需要3个非通配符"
我想在这里搜索日期,电子邮件,电话。
在zend/search/Lucene/search/search/query/wildcard文件中设置了一个参数,
private static $_minPrefixLength = 3;
改变它,它可能会工作…!
根据NaanuManu的建议,我做了更多的挖掘来解决这个问题-我在这里发布了我对一个相关问题的回答,但为了方便而重复:
直接取自Zend参考文档,您可以使用:
-
Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()
to查询最小前缀长度和 - 使用
Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()
来设置。
所以我的建议是:
-
使用
Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0)
设置prefixMinLength为0 使用javascript或其他方式验证所有搜索查询,以确保在使用任何通配符之前至少有
Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()
(我建议查询而不是假设默认的"3",因此验证是灵活的)