Skip to content

Commit 6ff0b5c

Browse files
committed
Switch name search to prefix search.
1 parent 0aeb41d commit 6ff0b5c

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

src/Share/Postgres/Search/DefinitionSearch/Queries.hs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module Share.Postgres.Search.DefinitionSearch.Queries
66
claimUnsyncedRelease,
77
insertDefinitionDocuments,
88
cleanIndexForRelease,
9-
defNameSearch,
9+
defNameInfixSearch,
1010
definitionSearch,
1111
DefnNameSearchFilter (..),
1212
-- Exported for logging/debugging
@@ -266,8 +266,9 @@ data DefnNameSearchFilter
266266
| ReleaseFilter ReleaseId
267267
| UserFilter UserId
268268

269-
defNameSearch :: Maybe UserId -> Maybe DefnNameSearchFilter -> Query -> Limit -> Transaction e [(ProjectId, ReleaseId, Name, TermOrTypeTag)]
270-
defNameSearch mayCaller mayFilter (Query query) limit = do
269+
-- | Find definitions whose name contains the query.
270+
defNameInfixSearch :: Maybe UserId -> Maybe DefnNameSearchFilter -> Query -> Limit -> Transaction e [(ProjectId, ReleaseId, Name, TermOrTypeTag)]
271+
defNameInfixSearch mayCaller mayFilter (Query query) limit = do
271272
let filters = case mayFilter of
272273
Just (ProjectFilter projId) -> [sql| AND doc.project_id = #{projId} |]
273274
Just (ReleaseFilter relId) -> [sql| AND doc.release_id = #{relId} |]
@@ -280,10 +281,8 @@ defNameSearch mayCaller mayFilter (Query query) limit = do
280281
JOIN projects p ON p.id = doc.project_id
281282
JOIN project_releases r ON r.id = doc.release_id
282283
WHERE
283-
-- Search name by a trigram 'word similarity'
284-
-- which will match if the query is similar to any 'word' (e.g. name segment)
285-
-- in the name.
286-
#{query} <% doc.name
284+
-- Find names which contain the query
285+
doc.name ILIKE ('%' || like_escape(#{query}) || '%')
287286
AND (NOT p.private OR (#{mayCaller} IS NOT NULL AND EXISTS (SELECT FROM accessible_private_projects pp WHERE pp.user_id = #{mayCaller} AND pp.project_id = p.id)))
288287
^{filters}
289288
ORDER BY doc.project_id, doc.name, r.major_version, r.minor_version, r.patch_version
@@ -292,14 +291,17 @@ defNameSearch mayCaller mayFilter (Query query) limit = do
292291
best_results(project_id, release_id, name, tag) AS (
293292
SELECT m.project_id, m.release_id, m.name, m.tag
294293
FROM matches_deduped_by_project m
295-
ORDER BY similarity(#{query}, m.name) DESC
294+
-- Prefer matches where the query is near the end of the name,
295+
-- e.g. for query 'List', 'data.List' should come before 'data.List.map'
296+
ORDER BY length(m.name) - position(#{query} in m.name) ASC
296297
LIMIT #{limit}
297298
)
298299
-- THEN sort docs to the bottom.
299300
SELECT br.project_id, br.release_id, br.name, br.tag
300301
FROM best_results br
301302
-- docs and tests to the bottom, but otherwise sort by quality of the match.
302-
ORDER BY (br.tag <> 'doc'::definition_tag, br.tag <> 'test'::definition_tag, br.name LIKE ('%' || like_escape(#{query})), similarity(#{query}, br.name)) DESC
303+
ORDER BY br.tag <> 'doc'::definition_tag, br.tag <> 'test'::definition_tag DESC,
304+
length(br.name) - position(#{query} in br.name) ASC
303305
|]
304306

305307
definitionSearch :: Maybe UserId -> Maybe DefnNameSearchFilter -> Limit -> Set (DefnSearchToken (Either Name ShortHash)) -> Maybe Arity -> Transaction e [(ProjectId, ReleaseId, Name, TermOrTypeSummary)]

src/Share/Web/Share/Impl.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ searchDefinitionNamesEndpoint ::
382382
WebApp [DefinitionNameSearchResult]
383383
searchDefinitionNamesEndpoint callerUserId query mayLimit userFilter projectFilter releaseFilter = do
384384
filter <- runMaybeT $ resolveProjectAndReleaseFilter projectFilter releaseFilter <|> resolveUserFilter userFilter
385-
matches <- PG.runTransaction $ DDQ.defNameSearch callerUserId filter query limit
385+
matches <- PG.runTransaction $ DDQ.defNameInfixSearch callerUserId filter query limit
386386
let response = matches <&> \(_projId, _releaseId, name, tag) -> DefinitionNameSearchResult name tag
387387
pure response
388388
where

transcripts/share-apis/search/name-search-suffix.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
{
44
"tag": "plain",
55
"token": "function.const"
6-
},
7-
{
8-
"tag": "data-constructor",
9-
"token": "data.List.Cons"
106
}
117
],
128
"status": [

0 commit comments

Comments
 (0)