diff --git a/src/applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php b/src/applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php --- a/src/applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php +++ b/src/applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php @@ -55,6 +55,8 @@ ->getNgramsFromString($ngrams_source, 'index'); $ferret_document->openTransaction(); + + try { $this->deleteOldDocument($engine, $object, $document); $ferret_document->save(); @@ -85,6 +87,11 @@ $ferret_ngrams->getTableName(), $chunk); } + } catch (Exception $ex) { + $ferret_document->killTransaction(); + throw $ex; + } + $ferret_document->saveTransaction(); } diff --git a/src/applications/search/ngrams/PhabricatorNgramEngine.php b/src/applications/search/ngrams/PhabricatorNgramEngine.php --- a/src/applications/search/ngrams/PhabricatorNgramEngine.php +++ b/src/applications/search/ngrams/PhabricatorNgramEngine.php @@ -26,9 +26,11 @@ break; } - $len = (strlen($token) - 2); + $token_v = phutil_utf8v($token); + $len = (count($token_v) - 2); for ($ii = 0; $ii < $len; $ii++) { - $ngram = substr($token, $ii, 3); + $ngram = array_slice($token_v, $ii, 3); + $ngram = implode('', $ngram); $ngrams[$ngram] = $ngram; } }