0

我将 symfony 与 Zend Lucene Search 一起使用。我有

$query = Zend_Search_Lucene_Search_QueryParser::parse($query.'*');
$hits = self::getLuceneIndex()->find($query);

有时我有错误:

模式开头至少需要 3 个非通配符。

当我在文档中做出类似的事情时:

$pattern = new Zend_Search_Lucene_Index_Term($query.'*');
$query = new Zend_Search_Lucene_Search_Query_Wildcard($pattern);
$hits = self::getLuceneIndex()->find($query);

它什么也没找到。

4

2 回答 2

1

我不对,但这对我有用:

因此,在我的情况下查询失败,因为它有 < 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);

因为它不适合我。

于 2011-07-25T14:36:07.300 回答
1

直接取自Zend 参考文档,您可以使用:

  • Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()查询所需的最小前缀长度和
  • 用来Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()设置它。

所以我的建议是两件事之一:

  1. 使用将 prefixMinLength 设置为 0 Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(0)- 基于此,您的原始代码片段应该可以正常工作(它为我的 Zend Lucene 实现做了)

  2. 正如您自己建议的那样,使用 javascript 或其他方式验证所有搜索查询,以确保在使用任何通配符之前至少有一个Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()(我建议查询它而不是假设默认值为“3”,以便验证灵活)

于 2013-01-06T22:01:54.673 回答