From fc220dea3996785a683b2661a711952f53f8da8d Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 29 Apr 2026 18:07:32 +0100 Subject: [PATCH] Search: Fixed exact saerch term negation causing no results Closes #6121 --- app/Search/SearchRunner.php | 10 ++++++++-- tests/Search/EntitySearchTest.php | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/Search/SearchRunner.php b/app/Search/SearchRunner.php index bfb65cf0f..391254172 100644 --- a/app/Search/SearchRunner.php +++ b/app/Search/SearchRunner.php @@ -120,8 +120,14 @@ class SearchRunner $filter = function (EloquentBuilder $query) use ($exact) { $inputTerm = str_replace('\\', '\\\\', $exact->value); $query->where('name', 'like', '%' . $inputTerm . '%') - ->orWhere('description', 'like', '%' . $inputTerm . '%') - ->orWhere('text', 'like', '%' . $inputTerm . '%'); + ->orWhere(function (EloquentBuilder $query) use ($inputTerm) { + $query->whereNotNull('description') + ->where('description', 'like', '%' . $inputTerm . '%'); + }) + ->orWhere(function (EloquentBuilder $query) use ($inputTerm) { + $query->whereNotNull('text') + ->where('text', 'like', '%' . $inputTerm . '%'); + }); }; $exact->negated ? $entityQuery->whereNot($filter) : $entityQuery->where($filter); diff --git a/tests/Search/EntitySearchTest.php b/tests/Search/EntitySearchTest.php index cb1149dd1..fc300241b 100644 --- a/tests/Search/EntitySearchTest.php +++ b/tests/Search/EntitySearchTest.php @@ -136,17 +136,21 @@ class EntitySearchTest extends TestCase $page->tags()->saveMany([new Tag(['name' => 'DonkCount', 'value' => '500'])]); $page->created_by = $this->users->admin()->id; $page->save(); + $otherPage = $this->entities->newPage(['name' => 'A different page in negation tests', 'html' => '

A different page in negation tests

']); $editor = $this->users->editor(); $this->actingAs($editor); $exactSearch = $this->get('/search?term=' . urlencode('negation -"tortoise"')); $exactSearch->assertStatus(200)->assertDontSeeText($page->name); + $exactSearch->assertSeeText($otherPage->name); $tagSearchA = $this->get('/search?term=' . urlencode('negation [DonkCount=500]')); $tagSearchA->assertStatus(200)->assertSeeText($page->name); + $tagSearchA->assertDontSeeText($otherPage->name); $tagSearchB = $this->get('/search?term=' . urlencode('negation -[DonkCount=500]')); $tagSearchB->assertStatus(200)->assertDontSeeText($page->name); + $tagSearchB->assertSeeText($otherPage->name); $filterSearchA = $this->get('/search?term=' . urlencode('negation -{created_by:me}')); $filterSearchA->assertStatus(200)->assertSeeText($page->name);