chore(db): simplify MultiFieldSearch

This commit is contained in:
kolaente 2025-06-18 19:23:50 +02:00
parent 22579dffae
commit 1e3a68210a
1 changed files with 14 additions and 22 deletions

View File

@ -47,36 +47,28 @@ func ParadeDBAvailable() bool {
// using a single query rather than multiple OR conditions.
// Falls back to individual ILIKE queries for PGroonga and standard PostgreSQL.
func MultiFieldSearch(fields []string, search string) builder.Cond {
if Type() == schemas.POSTGRES {
if paradedbInstalled {
// For ParadeDB, use the optimized disjunction_max approach for multi-field search
// This provides better relevance scoring than individual OR conditions
if len(fields) == 1 {
// Single field search - use optimized match function
return builder.Expr("id @@@ paradedb.match(?, ?)", fields[0], search)
}
// Multi-field search - use disjunction_max for optimal performance
fieldMatches := make([]string, len(fields))
args := make([]interface{}, len(fields)*2)
for i, field := range fields {
fieldMatches[i] = "paradedb.match(?, ?)"
args[i*2] = field
args[i*2+1] = search
}
return builder.Expr("id @@@ paradedb.disjunction_max(ARRAY["+strings.Join(fieldMatches, ", ")+"])", args...)
if Type() == schemas.POSTGRES && paradedbInstalled {
// For ParadeDB, use the optimized disjunction_max approach for multi-field search
// This provides better relevance scoring than individual OR conditions
if len(fields) == 1 {
// Single field search - use optimized match function
return builder.Expr("id @@@ paradedb.match(?, ?)", fields[0], search)
}
// For standard PostgreSQL, use ILIKE on all fields
conditions := make([]builder.Cond, len(fields))
// Multi-field search - use disjunction_max for optimal performance
fieldMatches := make([]string, len(fields))
args := make([]interface{}, len(fields)*2)
for i, field := range fields {
conditions[i] = builder.Expr(field+" ILIKE ?", "%"+search+"%")
fieldMatches[i] = "paradedb.match(?, ?)"
args[i*2] = field
args[i*2+1] = search
}
return builder.Or(conditions...)
return builder.Expr("id @@@ paradedb.disjunction_max(ARRAY["+strings.Join(fieldMatches, ", ")+"])", args...)
}
// For non-PostgreSQL databases, use LIKE on all fields
conditions := make([]builder.Cond, len(fields))
for i, field := range fields {
conditions[i] = &builder.Like{field, "%" + search + "%"}
conditions[i] = ILIKE(field, search)
}
return builder.Or(conditions...)
}