feat: implement wildcard query functionality for enhanced search capabilities

This commit is contained in:
Linus Rath
2026-03-14 16:50:43 +01:00
parent c024d89477
commit f1f31df0af
3 changed files with 386 additions and 14 deletions
+15 -1
View File
@@ -22,6 +22,20 @@ export const DEFAULT_SEARCH_FILTERS: SearchFilters = {
isStarred: null,
};
/**
* Appends wildcard `*` to each word in a query to enable prefix matching
* in Stalwart's full-text search engine. For example, "prim" becomes "prim*"
* which matches "prime", "primary", etc.
*/
export function toWildcardQuery(query: string): string {
return query
.trim()
.split(/\s+/)
.filter(Boolean)
.map((word) => (word.endsWith('*') || word.endsWith('"') ? word : word + '*'))
.join(' ');
}
export function buildJMAPFilter(
textQuery: string,
filters: SearchFilters,
@@ -30,7 +44,7 @@ export function buildJMAPFilter(
const conditions: Record<string, unknown>[] = [];
if (textQuery) {
conditions.push({ text: textQuery });
conditions.push({ text: toWildcardQuery(textQuery) });
}
if (filters.from) {