Use PostgreSQL FTS for searches.
parent
4c170d2a98
commit
dd5e02ad5d
|
@ -3,7 +3,7 @@
|
|||
class Api::V1::SearchController < Api::BaseController
|
||||
include Authorization
|
||||
|
||||
RESULTS_LIMIT = 20
|
||||
RESULTS_LIMIT = 33
|
||||
|
||||
before_action -> { doorkeeper_authorize! :read, :'read:search' }
|
||||
before_action :require_user!
|
||||
|
|
|
@ -298,6 +298,23 @@ class Status < ApplicationRecord
|
|||
after_find :limit_domain_visibility
|
||||
|
||||
class << self
|
||||
def search_for(term, limit = 33, account = nil)
|
||||
pattern = sanitize_sql_like(term)
|
||||
pattern = "#{pattern}"
|
||||
Status.unscoped {
|
||||
scope = Status.where("tsv @@ plainto_tsquery('english', ?)", pattern)
|
||||
query = scope.where(visibility: :public)
|
||||
if account.present?
|
||||
query = query
|
||||
.or(scope.where(account: account))
|
||||
.or(scope.where(account: account.following, visibility: [:unlisted, :private]))
|
||||
.or(scope.where(id: account.mentions.select(:status_id)))
|
||||
end
|
||||
query = query.where(reblog_of_id: nil).order(id: :desc).limit(limit)
|
||||
apply_timeline_filters(query, account, true)
|
||||
}
|
||||
end
|
||||
|
||||
def selectable_visibilities
|
||||
visibilities.keys - %w(direct limited)
|
||||
end
|
||||
|
|
|
@ -16,6 +16,7 @@ class SearchService < BaseService
|
|||
results[:accounts] = perform_accounts_search! if account_searchable?
|
||||
results[:statuses] = perform_statuses_search! if full_text_searchable?
|
||||
results[:hashtags] = perform_hashtags_search! if hashtag_searchable?
|
||||
results[:statuses] = Status.search_for(query.gsub(/\A#/, ''), limit, account) unless query.start_with?('@') or query.start_with?('#')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue