根据文档,当查询语法出现错误时,会抛出 Zend_Search_Lucene_Search_QueryParserException。
所以我检查了源代码,这就是引发错误的地方:
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_rqFirstTerm, $this->_encoding);
if (count($tokens) > 1) {
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
} else if (count($tokens) == 1) {
require_once 'Zend/Search/Lucene/Index/Term.php';
$from = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
} else {
$from = null;
}
$tokens = Zend_Search_Lucene_Analysis_Analyzer::getDefault()->tokenize($this->_currentToken->text, $this->_encoding);
if (count($tokens) > 1) {
require_once 'Zend/Search/Lucene/Search/QueryParserException.php';
throw new Zend_Search_Lucene_Search_QueryParserException('Range query boundary terms must be non-multiple word terms');
} else if (count($tokens) == 1) {
require_once 'Zend/Search/Lucene/Index/Term.php';
$to = new Zend_Search_Lucene_Index_Term(reset($tokens)->getTermText(), $this->_context->getField());
} else {
$to = null;
}
这包含在openedRQLastTerm()
它将处理最后一个范围查询词(打开的间隔)的函数中。
在调查了查询有什么问题以及为什么它不能对其进行标记之后,我在文档中发现了一个关于如何进行范围查询的可能解决方案:
范围查询允许开发人员或用户匹配其字段值在范围查询指定的下限和上限之间的文档。范围查询可以包括或不包括上限和下限。排序是按字典顺序执行的。
mod_date:[20020101 TO 20030101]
因此,您可以通过删除日期中的连字符来获得一些运气。另外,考虑一下论坛中提到的一些内容:
在索引和搜索之前,您必须将默认分析器切换到 TextNum。默认分析器跳过数字:
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive())
并且:
'publishDate' 字段需要在索引时设置为'keyword',否则范围查询不会获取任何结果。
希望所有这些信息可以帮助您解决问题!祝你好运。