Use PostgreSQL FTS for searches.
parent
4c170d2a98
commit
dd5e02ad5d
|
@ -3,7 +3,7 @@
|
||||||
class Api::V1::SearchController < Api::BaseController
|
class Api::V1::SearchController < Api::BaseController
|
||||||
include Authorization
|
include Authorization
|
||||||
|
|
||||||
RESULTS_LIMIT = 20
|
RESULTS_LIMIT = 33
|
||||||
|
|
||||||
before_action -> { doorkeeper_authorize! :read, :'read:search' }
|
before_action -> { doorkeeper_authorize! :read, :'read:search' }
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
|
|
|
@ -298,6 +298,23 @@ class Status < ApplicationRecord
|
||||||
after_find :limit_domain_visibility
|
after_find :limit_domain_visibility
|
||||||
|
|
||||||
class << self
|
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
|
def selectable_visibilities
|
||||||
visibilities.keys - %w(direct limited)
|
visibilities.keys - %w(direct limited)
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,6 +16,7 @@ class SearchService < BaseService
|
||||||
results[:accounts] = perform_accounts_search! if account_searchable?
|
results[:accounts] = perform_accounts_search! if account_searchable?
|
||||||
results[:statuses] = perform_statuses_search! if full_text_searchable?
|
results[:statuses] = perform_statuses_search! if full_text_searchable?
|
||||||
results[:hashtags] = perform_hashtags_search! if hashtag_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
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue