Zend_Search_Lucene范围查询错误

时间:2010-05-11 16:31:48

标签: php zend-framework zend-search-lucene

我已使用日期字段设置每个文档。 (关键字)

存储在其中的值采用此格式; 20100511

每次尝试执行远程查询时,都会出现以下错误:

date:[10000000 TO 20000000]
  

至少一个范围查询边界词   必须是非空的术语

任何人都有线索?

更新

我已经让这个以编程方式工作了。 这是否意味着解析器有问题?

$from  = new Zend_Search_Lucene_Index_Term('10000000', 'dateOfBirthMod');
$to    = new Zend_Search_Lucene_Index_Term('20000000', 'dateOfBirthMod');
$query = new Zend_Search_Lucene_Search_Query_Range($from, $to, true);

4 个答案:

答案 0 :(得分:3)

实际上,这更像是一个可疑的默认值,而不是一个bug。您可以更改分析仪以允许数字。实际上,您甚至可以编写自定义分析器。见http://framework.zend.com/manual/en/zend.search.lucene.extending.html

允许数字被标记化的设置是

Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive());

在Zf 1.x和Zf 2.x

Zend\Search\Lucene\Analysis\Analyzer\Analyzer::setDefault(new Zend\Search\Lucene\Analysis\Analyzer\Common\TextNum\CaseInsensitive());

答案 1 :(得分:2)

显然it is a bug在查询解析器中(相当老btw)。我建议您为该问题添加注释或打开一个新注释以确认它仍然在ZF的x.x版本中发生。

答案 2 :(得分:1)

我已经找到了这个bug的解决方法,这个bug源于名为tokenize()的方法,该方法不返回任何值,可以在Zend / Search / Lucene / Analysis / Analyzer.php中找到

如果使用最新的ZF版本(1.10.7),可以尝试使用以下代码替换代码。

public function tokenize($data, $encoding = '')
{
    $this->setInput($data, $encoding);

    $tokenList = array();
    /*
    while (($nextToken = $this->nextToken()) !== null) {
        $tokenList[] = $this->_input;
    }
    */
        $tokenList[] = new Zend_Search_Lucene_Analysis_Token( $this->_input, 1, 1 );

    return $tokenList;
}

我不知道它是否适用于旧版本。

答案 3 :(得分:0)

首先,您必须在找到

之前将默认分析器更改为TextNum以允许数字

ZF2:

\ZendSearch\Lucene\Analysis\Analyzer\Analyzer::setDefault(new \ZendSearch\Lucene\Analysis\Analyzer\Common\TextNum\CaseInsensitive());

其次,您的日期字段必须是关键字,而不是文本。