12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # 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
|