ドキュメントによると、クエリ構文にエラーがある場合、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」として設定する必要があります。そうしないと、範囲クエリは結果をフェッチしません。
うまくいけば、その情報のすべてがあなたの問題を解決するのに役立つでしょう!幸運を。