From de4f65fedef7ab661624477305e417db6ad52fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 29 Mar 2022 12:42:17 +0200 Subject: [PATCH] change strategy for searching: use the AND between words, instead of OR --- .../Search/Entity/SearchUserApiProvider.php | 2 +- .../Repository/PersonACLAwareRepository.php | 12 ++++++------ .../Search/ThirdPartyApiSearch.php | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php b/src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php index 32c0a3b43..56470c78b 100644 --- a/src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php +++ b/src/Bundle/ChillMainBundle/Search/Entity/SearchUserApiProvider.php @@ -45,7 +45,7 @@ class SearchUserApiProvider implements SearchApiInterface $query ->setSelectKey('user') ->setSelectJsonbMetadata("jsonb_build_object('id', u.id)") - ->setSelectPertinence('GREATEST(SIMILARITY(LOWER(UNACCENT(?)), u.label), + ->setSelectPertinence('3 + GREATEST(SIMILARITY(LOWER(UNACCENT(?)), u.label), SIMILARITY(LOWER(UNACCENT(?)), u.usernamecanonical))', [$pattern, $pattern]) ->setFromClause('users AS u') ->setWhereClauses(' diff --git a/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php b/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php index 78745af1d..5ed9762c8 100644 --- a/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php +++ b/src/Bundle/ChillPersonBundle/Repository/PersonACLAwareRepository.php @@ -133,8 +133,8 @@ final class PersonACLAwareRepository implements PersonACLAwareRepositoryInterfac $pertinence = []; $pertinenceArgs = []; - $orWhereSearchClause = []; - $orWhereSearchClauseArgs = []; + $andWhereSearchClause = []; + $andWhereSearchClauseArgs = []; if ('' !== $default) { foreach (explode(' ', $default) as $str) { @@ -145,15 +145,15 @@ final class PersonACLAwareRepository implements PersonACLAwareRepositoryInterfac '(starts_with(LOWER(UNACCENT(lastname)), UNACCENT(LOWER(?))))::int'; array_push($pertinenceArgs, $str, $str, $str, $str); - $orWhereSearchClause[] = + $andWhereSearchClause[] = '(LOWER(UNACCENT(?)) <<% person.fullnamecanonical OR ' . "person.fullnamecanonical LIKE '%' || LOWER(UNACCENT(?)) || '%' )"; - array_push($orWhereSearchClauseArgs, $str, $str); + array_push($andWhereSearchClauseArgs, $str, $str); } $query->andWhereClause( - implode(' OR ', $orWhereSearchClause), - $orWhereSearchClauseArgs + implode(' AND ', $andWhereSearchClause), + $andWhereSearchClauseArgs ); } else { $pertinence = ['1']; diff --git a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php index e4b7f43af..c5ab27440 100644 --- a/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php +++ b/src/Bundle/ChillThirdPartyBundle/Search/ThirdPartyApiSearch.php @@ -109,11 +109,11 @@ class ThirdPartyApiSearch implements SearchApiInterface } $query - ->setSelectPertinence(implode(' + ', $pertinence), array_merge( + ->setSelectPertinence(implode(' + ', $pertinence).' + 1', array_merge( [], ...$pertinenceArgs )) - ->andWhereClause(implode(' OR ', $wheres), array_merge( + ->andWhereClause(implode(' AND ', $wheres), array_merge( [], ...$whereArgs ));