From 88f316d6a7872b684526b80465ef41c03c72220c Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Tue, 8 Mar 2022 17:43:40 -0800 Subject: [PATCH] Implement JP search and trigram for EN --- app/controllers/api/v1/search_controller.rb | 30 +++++++++++++++------ app/models/character.rb | 16 ++++++++--- app/models/summon.rb | 15 ++++++++--- app/models/weapon.rb | 15 ++++++++--- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb index 3d3e9bd..e169fd5 100644 --- a/app/controllers/api/v1/search_controller.rb +++ b/app/controllers/api/v1/search_controller.rb @@ -1,28 +1,42 @@ class Api::V1::SearchController < Api::V1::ApiController def characters + locale = params[:locale] || 'en' + if params[:query].present? - excludes = params[:excludes] ? - params[:excludes].split(',').map { |e| "%#{e.gsub(/\([^()]*\)/, '').strip}%" } : '' - - @characters = Character.where("name_en ILIKE ? AND name_en NOT ILIKE ALL(ARRAY[?])", "%#{params[:query]}%", excludes).limit(10) - # @characters = Character.search(query).limit(10) + if locale == 'ja' + @characters = Character.jp_search(params[:query]).limit(10) + else + # @characters = Character.where("name_en ILIKE ? AND name_en NOT ILIKE ALL(ARRAY[?])", "%#{params[:query]}%", excludes).limit(10) + @characters = Character.en_search(params[:query]).limit(10) + end else @characters = Character.all end end def weapons + locale = params[:locale] || 'en' + if params[:query].present? - @weapons = Weapon.search(params[:query]).limit(10) + if locale == 'ja' + @weapons = Weapon.jp_search(params[:query]).limit(10) + else + @weapons = Weapon.en_search(params[:query]).limit(10) + end else @weapons = Weapon.all end end def summons + locale = params[:locale] || 'en' + if params[:query].present? - excludes = params[:excludes] ? params[:excludes].split(',').each { |e| "!#{e}" }.join(' ') : '' - @summons = Summon.search(params[:query]).limit(10) + if locale == 'ja' + @summons = Summon.jp_search(params[:query]).limit(10) + else + @summons = Summon.en_search(params[:query]).limit(10) + end else @summons = Summon.all end diff --git a/app/models/character.rb b/app/models/character.rb index e757856..fd3a1b5 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -1,12 +1,20 @@ class Character < ApplicationRecord include PgSearch::Model - pg_search_scope :search, - against: [:name_en, :name_jp], + pg_search_scope :en_search, + against: :name_en, + using: { + trigram: { + threshold: 0.18 + } + } + + pg_search_scope :jp_search, + against: :name_jp, using: { tsearch: { - negation: true, - prefix: true + prefix: true, + dictionary: "simple" } } diff --git a/app/models/summon.rb b/app/models/summon.rb index fc66eae..bec63b6 100644 --- a/app/models/summon.rb +++ b/app/models/summon.rb @@ -1,11 +1,20 @@ class Summon < ApplicationRecord include PgSearch::Model - pg_search_scope :search, - against: [:name_en, :name_jp], + pg_search_scope :en_search, + against: :name_en, + using: { + trigram: { + threshold: 0.18 + } + } + + pg_search_scope :jp_search, + against: :name_jp, using: { tsearch: { - prefix: true + prefix: true, + dictionary: "simple" } } diff --git a/app/models/weapon.rb b/app/models/weapon.rb index 6d27386..6662330 100644 --- a/app/models/weapon.rb +++ b/app/models/weapon.rb @@ -1,11 +1,20 @@ class Weapon < ApplicationRecord include PgSearch::Model - pg_search_scope :search, - against: [:name_en, :name_jp], + pg_search_scope :en_search, + against: :name_en, + using: { + trigram: { + threshold: 0.18 + } + } + + pg_search_scope :jp_search, + against: :name_jp, using: { tsearch: { - prefix: true + prefix: true, + dictionary: "simple" } }