Commit 7c5f078854757674bc420464f8e6b39b629a2761
1 parent
44a0ea13
KTS-2787
"Search reports document indexer inconsistency and that the administrator must be contacted when the indexer has values but the document no longer exists in the repository" Fixed. Committed By: Conrad Vermeulen Reviewed By: Jalaloedien Abrahams git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@7832 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
2 changed files
with
44 additions
and
9 deletions
search2/indexing/indexerCore.inc.php
| @@ -39,6 +39,9 @@ | @@ -39,6 +39,9 @@ | ||
| 39 | require_once('indexing/extractorCore.inc.php'); | 39 | require_once('indexing/extractorCore.inc.php'); |
| 40 | require_once(KT_DIR . '/plugins/ktcore/scheduler/schedulerUtil.php'); | 40 | require_once(KT_DIR . '/plugins/ktcore/scheduler/schedulerUtil.php'); |
| 41 | 41 | ||
| 42 | + | ||
| 43 | +class IndexerInconsistencyException extends Exception {}; | ||
| 44 | + | ||
| 42 | class QueryResultItem | 45 | class QueryResultItem |
| 43 | { | 46 | { |
| 44 | protected $document_id; | 47 | protected $document_id; |
| @@ -92,7 +95,7 @@ class QueryResultItem | @@ -92,7 +95,7 @@ class QueryResultItem | ||
| 92 | case 'Title': return isset($this->title); | 95 | case 'Title': return isset($this->title); |
| 93 | case null: break; | 96 | case null: break; |
| 94 | default: | 97 | default: |
| 95 | - throw new Exception("Unknown property '$property' to get on MatchResult"); | 98 | + throw new Exception("Unknown property '$property' to get on QueryResultItem"); |
| 96 | } | 99 | } |
| 97 | return true; // should not be reached | 100 | return true; // should not be reached |
| 98 | } | 101 | } |
| @@ -137,7 +140,7 @@ class QueryResultItem | @@ -137,7 +140,7 @@ class QueryResultItem | ||
| 137 | $msg = 'The database did not have a record matching the result from the document indexer. This may occur if there is an inconsistency between the document indexer and the repository. The indexer needs to be repaired. Please consult the administrator guide as to how to repair your indexer.'; | 140 | $msg = 'The database did not have a record matching the result from the document indexer. This may occur if there is an inconsistency between the document indexer and the repository. The indexer needs to be repaired. Please consult the administrator guide as to how to repair your indexer.'; |
| 138 | $default->log->error('QueryResultItem: ' . $msg); | 141 | $default->log->error('QueryResultItem: ' . $msg); |
| 139 | // TODO: repair process where we scan documents in index, and delete those for which there is nothing in the repository | 142 | // TODO: repair process where we scan documents in index, and delete those for which there is nothing in the repository |
| 140 | - throw new Exception(_kt($msg)); | 143 | + throw new IndexerInconsistencyException(_kt($msg)); |
| 141 | } | 144 | } |
| 142 | 145 | ||
| 143 | // document_id, relevance, text, title | 146 | // document_id, relevance, text, title |
| @@ -274,7 +277,7 @@ class QueryResultItem | @@ -274,7 +277,7 @@ class QueryResultItem | ||
| 274 | case 'Title': $this->title = $value; break; | 277 | case 'Title': $this->title = $value; break; |
| 275 | case 'Text': $this->text = $value; break; | 278 | case 'Text': $this->text = $value; break; |
| 276 | default: | 279 | default: |
| 277 | - throw new Exception("Unknown property '$property' to set on MatchResult"); | 280 | + throw new Exception("Unknown property '$property' to set on QueryResultItem"); |
| 278 | } | 281 | } |
| 279 | } | 282 | } |
| 280 | } | 283 | } |
| @@ -1144,6 +1147,29 @@ abstract class Indexer | @@ -1144,6 +1147,29 @@ abstract class Indexer | ||
| 1144 | */ | 1147 | */ |
| 1145 | protected abstract function indexDocument($docId, $textFile, $title, $version); | 1148 | protected abstract function indexDocument($docId, $textFile, $title, $version); |
| 1146 | 1149 | ||
| 1150 | + | ||
| 1151 | + public function updateDocumentIndex($docId, $text) | ||
| 1152 | + { | ||
| 1153 | + $config = KTConfig::getSingleton(); | ||
| 1154 | + $tempPath = $config->get("urls/tmpDirectory"); | ||
| 1155 | + $tempFile = tempnam($tempPath,'ud_'); | ||
| 1156 | + | ||
| 1157 | + file_put_contents($tempFile, $text); | ||
| 1158 | + | ||
| 1159 | + $document = Document::get($docId); | ||
| 1160 | + $title = $document->getDescription(); | ||
| 1161 | + $version = $document->getVersion(); | ||
| 1162 | + | ||
| 1163 | + $result = $this->indexDocument($docId, $tempFile, $title, $version); | ||
| 1164 | + | ||
| 1165 | + if (file_exists($tempFile)) | ||
| 1166 | + { | ||
| 1167 | + unlink($tempFile); | ||
| 1168 | + } | ||
| 1169 | + | ||
| 1170 | + return $result; | ||
| 1171 | + } | ||
| 1172 | + | ||
| 1147 | /** | 1173 | /** |
| 1148 | * Index a discussion. The base class must override this function. | 1174 | * Index a discussion. The base class must override this function. |
| 1149 | * | 1175 | * |
search2/indexing/indexers/JavaXMLRPCLuceneIndexer.inc.php
| @@ -168,6 +168,7 @@ class JavaXMLRPCLuceneIndexer extends Indexer | @@ -168,6 +168,7 @@ class JavaXMLRPCLuceneIndexer extends Indexer | ||
| 168 | */ | 168 | */ |
| 169 | public function query($query) | 169 | public function query($query) |
| 170 | { | 170 | { |
| 171 | + global $default; | ||
| 171 | $results = array(); | 172 | $results = array(); |
| 172 | $hits = $this->lucene->query($query); | 173 | $hits = $this->lucene->query($query); |
| 173 | if (is_array($hits)) | 174 | if (is_array($hits)) |
| @@ -179,14 +180,22 @@ class JavaXMLRPCLuceneIndexer extends Indexer | @@ -179,14 +180,22 @@ class JavaXMLRPCLuceneIndexer extends Indexer | ||
| 179 | // avoid adding duplicates. If it is in already, it has higher priority. | 180 | // avoid adding duplicates. If it is in already, it has higher priority. |
| 180 | if (!array_key_exists($document_id, $results) || $score > $results[$document_id]->Score) | 181 | if (!array_key_exists($document_id, $results) || $score > $results[$document_id]->Score) |
| 181 | { | 182 | { |
| 182 | - $item = new QueryResultItem($document_id); | ||
| 183 | - $item->Title = $hit->Title; | ||
| 184 | - $item->Text = $hit->Content; | ||
| 185 | - $item->Rank = $hit->Rank; | 183 | + try |
| 184 | + { | ||
| 185 | + $item = new QueryResultItem($document_id); | ||
| 186 | + $item->Title = $hit->Title; | ||
| 187 | + $item->Text = $hit->Content; | ||
| 188 | + $item->Rank = $hit->Rank; | ||
| 186 | 189 | ||
| 187 | - if ($item->CanBeReadByUser) | 190 | + if ($item->CanBeReadByUser) |
| 191 | + { | ||
| 192 | + $results[$document_id] = $item; | ||
| 193 | + } | ||
| 194 | + } | ||
| 195 | + catch(IndexerInconsistencyException $ex) | ||
| 188 | { | 196 | { |
| 189 | - $results[$document_id] = $item; | 197 | + $this->deleteDocument($document_id); |
| 198 | + $default->log->info("Document Indexer inconsistency: $document_id has been found in document index but is not in the database."); | ||
| 190 | } | 199 | } |
| 191 | } | 200 | } |
| 192 | } | 201 | } |