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

答えがとても単純で、少しばかげていると感じました。

トークンを1つの単語として渡すには、日付を引用符で囲む必要があります。例:

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