Change account search to match by text when opted-in (#25599)
Co-authored-by: Eugen Rochko <eugen@zeonfederated.com>
This commit is contained in:
parent
285a691936
commit
4581a528f7
5 changed files with 90 additions and 29 deletions
|
@ -9,12 +9,11 @@ class AccountSearchService < BaseService
|
|||
MIN_QUERY_LENGTH = 5
|
||||
|
||||
def call(query, account = nil, options = {})
|
||||
@acct_hint = query&.start_with?('@')
|
||||
@query = query&.strip&.gsub(/\A@/, '')
|
||||
@limit = options[:limit].to_i
|
||||
@offset = options[:offset].to_i
|
||||
@options = options
|
||||
@account = account
|
||||
@query = query&.strip&.gsub(/\A@/, '')
|
||||
@limit = options[:limit].to_i
|
||||
@offset = options[:offset].to_i
|
||||
@options = options
|
||||
@account = account
|
||||
|
||||
search_service_results.compact.uniq
|
||||
end
|
||||
|
@ -72,8 +71,8 @@ class AccountSearchService < BaseService
|
|||
end
|
||||
|
||||
def from_elasticsearch
|
||||
must_clauses = [{ multi_match: { query: terms_for_query, fields: likely_acct? ? %w(acct.edge_ngram acct) : %w(acct.edge_ngram acct display_name.edge_ngram display_name), type: 'most_fields', operator: 'and' } }]
|
||||
should_clauses = []
|
||||
must_clauses = must_clause
|
||||
should_clauses = should_clause
|
||||
|
||||
if account
|
||||
return [] if options[:following] && following_ids.empty?
|
||||
|
@ -88,7 +87,7 @@ class AccountSearchService < BaseService
|
|||
query = { bool: { must: must_clauses, should: should_clauses } }
|
||||
functions = [reputation_score_function, followers_score_function, time_distance_function]
|
||||
|
||||
records = AccountsIndex.query(function_score: { query: query, functions: functions, boost_mode: 'multiply', score_mode: 'avg' })
|
||||
records = AccountsIndex.query(function_score: { query: query, functions: functions })
|
||||
.limit(limit_for_non_exact_results)
|
||||
.offset(offset)
|
||||
.objects
|
||||
|
@ -133,6 +132,36 @@ class AccountSearchService < BaseService
|
|||
}
|
||||
end
|
||||
|
||||
def must_clause
|
||||
fields = %w(username username.* display_name display_name.*)
|
||||
fields << 'text' << 'text.*' if options[:use_searchable_text]
|
||||
|
||||
[
|
||||
{
|
||||
multi_match: {
|
||||
query: terms_for_query,
|
||||
fields: fields,
|
||||
type: 'best_fields',
|
||||
operator: 'or',
|
||||
},
|
||||
},
|
||||
]
|
||||
end
|
||||
|
||||
def should_clause
|
||||
[
|
||||
{
|
||||
multi_match: {
|
||||
query: terms_for_query,
|
||||
fields: %w(username username.* display_name display_name.*),
|
||||
type: 'best_fields',
|
||||
operator: 'and',
|
||||
boost: 10,
|
||||
},
|
||||
},
|
||||
]
|
||||
end
|
||||
|
||||
def following_ids
|
||||
@following_ids ||= account.active_relationships.pluck(:target_account_id) + [account.id]
|
||||
end
|
||||
|
@ -182,8 +211,4 @@ class AccountSearchService < BaseService
|
|||
def username_complete?
|
||||
query.include?('@') && "@#{query}".match?(MENTION_ONLY_RE)
|
||||
end
|
||||
|
||||
def likely_acct?
|
||||
@acct_hint || username_complete?
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue