1

我正在使用 Zend Search Lucene 来索引一些 DOCX 文件。

$index = Zend_Search_Lucene::create($indexpath);
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
$doc = Zend_Search_Lucene_Document_Docx::loadDocxFile($file);
$index->addDocument($doc);

这会索引以如下格式修改的字段调用下的最后修改日期

2012-01-19T11:56:00Z

如果我尝试对此值执行范围搜索,例如

Zend_Search_Lucene_Search_QueryParser::parse('modified:[2012-01-01 TO 2012-04-01]');

我收到以下错误消息

Uncaught exception 'Zend_Search_Lucene_Search_QueryParserException' with message 'Range query boundary terms must be non-multiple word terms'

有谁知道如何对 Zend DOCX 解析器创建的日期字段执行范围搜索?

4

2 回答 2

0

根据文档当查询语法出现错误时,会抛出 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',否则范围查询不会获取任何结果。

希望所有这些信息可以帮助您解决问题!祝你好运。

于 2012-04-11T12:04:36.953 回答
0

发现答案很简单,我觉得有点傻。

我需要将我的日期放在引号中以将令牌作为一个单词传递,例如

modified:["2012-04" TO "2012-01"]
于 2012-04-18T08:50:44.973 回答