Use PostgreSQL FTS for searches.

staging
multiple creatures 2019-04-13 23:17:51 -05:00
parent 4c170d2a98
commit dd5e02ad5d
3 changed files with 19 additions and 1 deletions

View File

@ -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!

View File

@ -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

View File

@ -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