The code powering m.abunchtell.com https://m.abunchtell.com
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

84 строки
1.6 KiB

  1. # frozen_string_literal: true
  2. class TagSearchService < BaseService
  3. def call(query, options = {})
  4. @query = query.strip.gsub(/\A#/, '')
  5. @offset = options[:offset].to_i
  6. @limit = options[:limit].to_i
  7. results = from_elasticsearch if Chewy.enabled?
  8. results ||= from_database
  9. results
  10. end
  11. private
  12. def from_elasticsearch
  13. query = {
  14. function_score: {
  15. query: {
  16. multi_match: {
  17. query: @query,
  18. fields: %w(name.edge_ngram name),
  19. type: 'most_fields',
  20. operator: 'and',
  21. },
  22. },
  23. functions: [
  24. {
  25. field_value_factor: {
  26. field: 'usage',
  27. modifier: 'log2p',
  28. missing: 0,
  29. },
  30. },
  31. {
  32. gauss: {
  33. last_status_at: {
  34. scale: '7d',
  35. offset: '14d',
  36. decay: 0.5,
  37. },
  38. },
  39. },
  40. ],
  41. boost_mode: 'multiply',
  42. },
  43. }
  44. filter = {
  45. bool: {
  46. should: [
  47. {
  48. term: {
  49. reviewed: {
  50. value: true,
  51. },
  52. },
  53. },
  54. {
  55. match: {
  56. name: {
  57. query: @query,
  58. },
  59. },
  60. },
  61. ],
  62. },
  63. }
  64. TagsIndex.query(query).filter(filter).limit(@limit).offset(@offset).objects.compact
  65. rescue Faraday::ConnectionFailed, Parslet::ParseFailed
  66. nil
  67. end
  68. def from_database
  69. Tag.search_for(@query, @limit, @offset)
  70. end
  71. end