我使用symfony与Zend Lucene搜索。我有
$query = Zend_Search_Lucene_Search_QueryParser::parse($query.'*');
$hits = self::getLuceneIndex()->find($query);
有时会出错:
pattern开头至少需要3个非通配符
当我在文档中创建like时:
$pattern = new Zend_Search_Lucene_Index_Term($query.'*');
$query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
$hits = self::getLuceneIndex()->find($query);
我不知道这是对的,但这对我来说是工作:
所以,在我的例子中,查询失败,因为它有<3个字符或有一些特殊字符,所以在我的搜索操作:
public function executeAds(sfWebRequest $request)
{
if (!$query = $request->getParameter('query'))
{
return $this->forward('search', 'adssearch');
}
$query = str_replace(" ", "", $query);
$query = preg_replace("/[^A-Za-z0-9]/","",$query);
if (strlen(trim($query))<3)
{
$this->redirect('search/notice');
}
$this->ads = Doctrine_Core::getTable('Ads') ->getAdsLuceneQuery($query);
我不使用
$pattern = new Zend_Search_Lucene_Index_Term($query.'*');
$query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
$hits = self::getLuceneIndex()->find($query);
因为这对我来说不是工作。
直接取自Zend Reference文档,您可以使用:
-
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 -基于此,您的原始代码片段应该工作良好(它为我的Zend Lucene实现) -
正如您自己建议的那样,使用javascript或其他方式验证所有搜索查询,以确保在使用任何通配符之前至少有
Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()
(我建议查询而不是假设默认的"3",因此验证是灵活的)