Ошибка запроса диапазона Zend_Search_Lucene
Я настроил каждый документ с полем даты. (ключевое слово)
В нем хранятся значения в этом формате; 20100511
Каждый раз, когда я пытаюсь выполнить ранжированный запрос, я получаю следующую ошибку:
date:[10000000 TO 20000000]
По крайней мере один термин границы диапазона запроса должен быть непустым
Кто-нибудь понял?
Обновить
Я получил это работать программно. Значит ли это, что парсер глючит?
$from = new Zend_Search_Lucene_Index_Term('10000000', 'dateOfBirthMod');
$to = new Zend_Search_Lucene_Index_Term('20000000', 'dateOfBirthMod');
$query = new Zend_Search_Lucene_Search_Query_Range($from, $to, true);
4 ответа
По-видимому, это ошибка в парсере запросов (кстати, довольно старая). Я бы посоветовал вам добавить комментарий к этой проблеме или открыть новый, чтобы подтвердить, что это все еще происходит в версии xx ZF.
На самом деле, это скорее сомнительный по умолчанию, а не ошибка. Вы можете изменить анализатор, чтобы разрешить номера. На самом деле, вы даже можете написать собственный анализатор. См. http://framework.zend.com/manual/en/zend.search.lucene.extending.html
Настройка для разрешения токенизации номеров
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive());
в Zf 1.x и в Zf 2.x
Zend\Search\Lucene\Analysis\Analyzer\Analyzer::setDefault(new Zend\Search\Lucene\Analysis\Analyzer\Common\TextNum\CaseInsensitive());
Я сделал обходной путь для этой ошибки, которая вытекает из метода tokenize(), который не возвращает никакого значения и который можно найти в Zend/Search/Lucene/Analysis/Analyzer.php
Вы можете попытаться заменить код следующим, если вы используете последнюю версию ZF (1.10.7).
public function tokenize($data, $encoding = '')
{
$this->setInput($data, $encoding);
$tokenList = array();
/*
while (($nextToken = $this->nextToken()) !== null) {
$tokenList[] = $this->_input;
}
*/
$tokenList[] = new Zend_Search_Lucene_Analysis_Token( $this->_input, 1, 1 );
return $tokenList;
}
Я не знаю, работает ли он в старых версиях или нет.
Во-первых, вы должны изменить анализатор по умолчанию на TextNum, чтобы разрешить число, прежде чем найти
ZF2:
\ZendSearch\Lucene\Analysis\Analyzer\Analyzer::setDefault(new \ZendSearch\Lucene\Analysis\Analyzer\Common\TextNum\CaseInsensitive());
Во-вторых, ваше поле даты ДОЛЖНО быть ключевым словом, а не текстом.