forked from asonix/mastodon
83 lines
1.5 KiB
Ruby
83 lines
1.5 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class TagSearchService < BaseService
|
||
|
def call(query, options = {})
|
||
|
@query = query.strip.gsub(/\A#/, '')
|
||
|
@offset = options[:offset].to_i
|
||
|
@limit = options[:limit].to_i
|
||
|
|
||
|
if Chewy.enabled?
|
||
|
from_elasticsearch
|
||
|
else
|
||
|
from_database
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def from_elasticsearch
|
||
|
query = {
|
||
|
function_score: {
|
||
|
query: {
|
||
|
multi_match: {
|
||
|
query: @query,
|
||
|
fields: %w(name.edge_ngram name),
|
||
|
type: 'most_fields',
|
||
|
operator: 'and',
|
||
|
},
|
||
|
},
|
||
|
|
||
|
functions: [
|
||
|
{
|
||
|
field_value_factor: {
|
||
|
field: 'usage',
|
||
|
modifier: 'log2p',
|
||
|
missing: 0,
|
||
|
},
|
||
|
},
|
||
|
|
||
|
{
|
||
|
gauss: {
|
||
|
last_status_at: {
|
||
|
scale: '7d',
|
||
|
offset: '14d',
|
||
|
decay: 0.5,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
|
||
|
boost_mode: 'multiply',
|
||
|
},
|
||
|
}
|
||
|
|
||
|
filter = {
|
||
|
bool: {
|
||
|
should: [
|
||
|
{
|
||
|
term: {
|
||
|
reviewed: {
|
||
|
value: true,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
|
||
|
{
|
||
|
term: {
|
||
|
name: {
|
||
|
value: @query,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
}
|
||
|
|
||
|
TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact
|
||
|
end
|
||
|
|
||
|
def from_database
|
||
|
Tag.search_for(@query, @limit, @offset)
|
||
|
end
|
||
|
end
|