diff --git a/app/Search/SearchResultsFormatter.php b/app/Search/SearchResultsFormatter.php index b06f81e0e..7bb5e03cc 100644 --- a/app/Search/SearchResultsFormatter.php +++ b/app/Search/SearchResultsFormatter.php @@ -91,7 +91,7 @@ class SearchResultsFormatter $offset = 0; $term = mb_strtolower($term); $pos = mb_strpos($text, $term, $offset); - while ($pos !== false) { + while ($pos !== false && count($matchRefs) < 25) { $end = $pos + mb_strlen($term); $matchRefs[$pos] = $end; $offset = $end; diff --git a/tests/Search/EntitySearchTest.php b/tests/Search/EntitySearchTest.php index ca900c2ed..8501b65c4 100644 --- a/tests/Search/EntitySearchTest.php +++ b/tests/Search/EntitySearchTest.php @@ -378,6 +378,21 @@ class EntitySearchTest extends TestCase $search->assertSee('На мен ми трябва нещо добро test', false); } + public function test_match_highlighting_is_efficient_with_large_frequency_in_content() + { + $content = str_repeat('superbeans ', 10000); + $this->entities->newPage([ + 'name' => 'Test Page', + 'html' => "
{$content}
", + ]); + + $time = microtime(true); + $resp = $this->asEditor()->get('/search?term=' . urlencode('superbeans')); + $this->assertLessThan(0.5, microtime(true) - $time); + + $resp->assertSee('superbeans', false); + } + public function test_html_entities_in_item_details_remains_escaped_in_search_results() { $this->entities->newPage(['name' => 'MyMy supercool <great> TestPageContent page
']);