Search document titles first

This commit is contained in:
shamoon 2024-04-04 15:55:05 -07:00
parent 0bee4789f6
commit 4ee76f4edf

View File

@ -1110,28 +1110,34 @@ class GlobalSearchView(PassUserMixin):
elif len(query) < 3: elif len(query) < 3:
return HttpResponseBadRequest("Query must be at least 3 characters") return HttpResponseBadRequest("Query must be at least 3 characters")
OBJECT_LIMIT = 3
docs = [] docs = []
if request.user.has_perm("documents.view_document"): if request.user.has_perm("documents.view_document"):
from documents import index all_docs = get_objects_for_user_owner_aware(
request.user,
"view_document",
Document,
)
# First search by title
docs = all_docs.filter(title__icontains=query)[:OBJECT_LIMIT]
if len(docs) < OBJECT_LIMIT:
# If we don't have enough results, search by content
from documents import index
with index.open_index_searcher() as s: with index.open_index_searcher() as s:
q, _ = index.DelayedFullTextQuery( q, _ = index.DelayedFullTextQuery(
s, s,
request.query_params, request.query_params,
10, 10,
request.user, request.user,
)._get_query() )._get_query()
results = s.search(q, limit=3) results = s.search(q, limit=OBJECT_LIMIT)
docs = get_objects_for_user_owner_aware( docs = docs | all_docs.filter(id__in=[r["id"] for r in results])
request.user,
"view_document",
Document,
).filter(id__in=[r["id"] for r in results])
tags = ( tags = (
get_objects_for_user_owner_aware(request.user, "view_tag", Tag).filter( get_objects_for_user_owner_aware(request.user, "view_tag", Tag).filter(
name__icontains=query, name__icontains=query,
)[:3] )[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_tag") if request.user.has_perm("documents.view_tag")
else [] else []
) )
@ -1140,7 +1146,7 @@ class GlobalSearchView(PassUserMixin):
request.user, request.user,
"view_correspondent", "view_correspondent",
Correspondent, Correspondent,
).filter(name__icontains=query)[:3] ).filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_correspondent") if request.user.has_perm("documents.view_correspondent")
else [] else []
) )
@ -1149,7 +1155,7 @@ class GlobalSearchView(PassUserMixin):
request.user, request.user,
"view_documenttype", "view_documenttype",
DocumentType, DocumentType,
).filter(name__icontains=query)[:3] ).filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_documenttype") if request.user.has_perm("documents.view_documenttype")
else [] else []
) )
@ -1158,37 +1164,37 @@ class GlobalSearchView(PassUserMixin):
request.user, request.user,
"view_storagepath", "view_storagepath",
StoragePath, StoragePath,
).filter(name__icontains=query)[:3] ).filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_storagepath") if request.user.has_perm("documents.view_storagepath")
else [] else []
) )
users = ( users = (
User.objects.filter(username__icontains=query)[:3] User.objects.filter(username__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("auth.view_user") if request.user.has_perm("auth.view_user")
else [] else []
) )
groups = ( groups = (
Group.objects.filter(name__icontains=query)[:3] Group.objects.filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("auth.view_group") if request.user.has_perm("auth.view_group")
else [] else []
) )
mail_rules = ( mail_rules = (
MailRule.objects.filter(name__icontains=query)[:3] MailRule.objects.filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("paperless_mail.view_mailrule") if request.user.has_perm("paperless_mail.view_mailrule")
else [] else []
) )
mail_accounts = ( mail_accounts = (
MailAccount.objects.filter(name__icontains=query)[:3] MailAccount.objects.filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("paperless_mail.view_mailaccount") if request.user.has_perm("paperless_mail.view_mailaccount")
else [] else []
) )
workflows = ( workflows = (
Workflow.objects.filter(name__icontains=query)[:3] Workflow.objects.filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_workflow") if request.user.has_perm("documents.view_workflow")
else [] else []
) )
custom_fields = ( custom_fields = (
CustomField.objects.filter(name__icontains=query)[:3] CustomField.objects.filter(name__icontains=query)[:OBJECT_LIMIT]
if request.user.has_perm("documents.view_customfield") if request.user.has_perm("documents.view_customfield")
else [] else []
) )