0

编辑:

现在解决了一个黑客。在第 473 行添加:

if (isset($this->_termsFreqs[$termId][$docId])) {

}

仅当我搜索多个单词时才会发生这种情况,例如:

+word1 +word2 + word3

我收到了这个巨大的错误:

Notice: Undefined offset: 2 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 2 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 4 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 4 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 6 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 6 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 1 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 1 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 9 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

Notice: Undefined offset: 9 in C:\wamp\www\project\library\Zend\Search\Lucene\Search\Query\MultiTerm.php on line 473

有趣的是返回的结果集是正确的,所以在生产中我可以关闭错误报告,它会像一个魅力一样工作,但我不想这样做。

此处记录了类似的问题:http: //framework.zend.com/issues/browse/ZF-5545

显然没有解决方案。

我也尝试过使用 UTF-8 兼容的文本分析器(即使索引中只有拉丁 1 字符):

Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
4

2 回答 2

1

未定义的偏移量只是意味着它试图获取一个不存在的数组值。解决方案是先检查 array_key_exists 以确保设置了密钥。从错误中提到的文件的源代码中,您需要在第 473 行附近添加这个 if 条件(第二行和第六行是添加的):

foreach ($this->_terms as $termId => $term) {
     if (array_key_exists($termId,$this->_weights)) {
         $score += $reader->getSimilarity()->tf($this->_termsFreqs[$termId][$docId]) *
                   $this->_weights[$termId]->getValue() *
                   $reader->norm($docId, $term->field);
     }
}

目前,由于$this->_weights[$termId]->getValue() 是在与其他值相乘后再加到$score 中,所以相乘的结果是0,什么都不加,所以结果是正确的。添加 if 不会改变这一点,因为无论哪种方式都不会添加任何内容。

于 2009-08-08T15:28:53.883 回答
1

你必须设置这个条件来抑制警告:

if (array_key_exists($termId, $this->_termsFreqs) && array_key_exists($docId, $this->_termsFreqs[$termId])) { ... }

但问题仍然存在,如果这有帮助。可能存在导致此未定义偏移的逻辑错误。

于 2009-11-27T14:56:40.967 回答