Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend search lucene DOCX日期范围查询导致错误“;范围查询边界术语必须是非多词术语“;_Php_Docx_Zend Search Lucene - Fatal编程技术网

Php Zend search lucene DOCX日期范围查询导致错误“;范围查询边界术语必须是非多词术语“;

Php Zend search lucene DOCX日期范围查询导致错误“;范围查询边界术语必须是非多词术语“;,php,docx,zend-search-lucene,Php,Docx,Zend Search Lucene,我正在使用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

我正在使用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);
这将在字段调用modified下索引上次修改的日期,格式如下

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解析器创建的日期字段上执行范围搜索吗?

根据查询语法中出现错误时,将抛出Zend_search\u Lucene_search\u 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;
}
这包含在
openedrqlasterm()
函数中,它将处理最后一个范围查询项(打开的间隔)

在研究了该查询的错误以及为什么它不能标记化它之后,我发现了一个可能的解决方案:

范围查询允许开发人员或用户匹配字段值介于范围查询指定的下限和上限之间的文档。范围查询可以包含或排除上限和下限。排序是按字典顺序进行的

因此,删除约会中的连字符可能会带来好运。此外,考虑在A:

中提到的一些事情。 在索引和搜索之前,必须将默认分析器切换为TextNum。默认分析器跳过数字:

而且:

编制索引时,“publishDate”字段需要设置为“关键字”,否则范围查询不会获取结果


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

发现答案太简单了,我觉得有点傻

我需要把我的日期放在引号中,以单个单词的形式传递令牌

modified:["2012-04" TO "2012-01"]

感谢您的帮助,只要看一下代码,我就意识到它正在将我的文本拆分为多个单词,我需要转义连字符。如果没有连字符,搜索将不起作用,除非您的搜索范围仅为年份,即198001到201212将返回0个结果。
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive())
modified:["2012-04" TO "2012-01"]