1

Для моего приложения Rails я пытаюсь настроить расширенный поиск с помощью Searckick (elasticsearch). Они делают то, что я пытаюсь сделать, это:Настройка расширенного поиска с помощью поиска, совмещение с ассоциациями с несколькими моделями (Rails)

  • позволяет найти информацию о пользователе, местоположении и компетенции и всегда получать профили пользователей в качестве результатов.

У меня есть исправление до сих пор, что я могу выполнить поиск у Пользователя, но я не уверен, как можно искать и на этих других моделях.

Мои маршруты:

Rails.application.routes.draw do 
    ActiveAdmin.routes(self) 
    devise_for :users, controllers: {sessions: "sessions", registrations:  
    "registrations"} 
    # For details on the DSL available within this file, see 
    http://guides.rubyonrails.org/routing.html 

    root 'pages#home' 

    get "/news", to: 'pages#news' 

    get "welcome_back", to: 'pages#welcome_back' 

    get "/profile", to: "profile#show" 

    resources :profiles do 
    collection do 
     get :autocomplete 
    end 
    end 

    namespace :profile do 
    resources :locations 
    resources :positions 
    resources :competences 
    end 
end 

Пользователь принадлежит Участке, имеет несколько Компетенции через присоединяемой таблицы. Другими словами: у пользователя есть location_id, и вы можете вызвать .competences для пользователя, чтобы узнать, какие пользователи_компетентны у Пользователя.

Может ли кто-нибудь сказать мне, как настроить этот поиск?

Мои профили Контроллер:

class ProfilesController < ApplicationController 

    def index 
    query = params[:search].presence || "*" 
    @users = User.search(query, suggest: true, operator: "or") 
    end 

    def autocomplete 
    render json: ["Test"] 
    end 

end 

Я пытался работать с четкости самости (поиск) в моей модели, но это не работает.

Что я пробовал:

def self.search(search) 
     where(["User.first_name LIKE ?","%#{search}%"]) 
     where(["User.last_name LIKE ?","%#{search}%"]) 
     where(["User.competences.collect{&:name} IN ?","%#{search}%"]) 
     joins(:location).where("location.name LIKE ?", "%#{search}%") 
    else 
     all 
    end 
    end 

ответ

1

TL; DR определить метод search_data настроить индекс поиска

self.search, как определено в настоящее время в вашем коде неверен Ваш метод self.search будет способ поиска через ActiveRecord и любую базу данных, которую вы используете. Это не то, как вы ищете через Searchkick.

Для Searchkick Если вы хотите вернуть профили пользователей, которые соответствуют поиск по атрибутам пользователей, компетенции и местоположения, то вы должны определить пользовательские атрибуты, компетенции и места, которые вы хотите искать с помощью пользовательских отображений с помощью метода search_data , документально here:

class User < ActiveRecord::Base 
    searchkick locations: ["location"] 
    # this line will eager load your assocations 
    scope :search_import, -> { includes(:location, :competences) } 

    def search_data 
    { 
     first_name: first_name, 
     last_name: last_name, 
     competences: competences.map(&:name), 
     # from your code above it looks like you want to search location.name 
     location_name: location.name 
     # the following merged hash would allow you to search by location latitude and 
     # longitude coordinates if you have them 
     ## if you don't use latitude and longitude then you don't need to include 
     ## `locations: ["location"] when you call searchkick in the User model on line 2 
     ## above or the merged location hash below 
    }.merge(location: {lat: location.latitude, lon: location.longitude}) 
    end 
end 

Теперь ваш поисковый запрос в Profiles#index действия будут работать:

@users = User.search(query, suggest: true, operator: "or") 

Нет необходимости в методе self.search, который вы определили.

Другие примечания

  • Я предполагаю, так как вы включили suggest: true в вашем запросе, который вы определили предложения по вашей модели пользователя правильно:

    class User < ActiveRecord::Base 
        searchkick locations: ["location"], suggest: [:first_name, :last_name, :location_name] # or whatever fields you want 
    end 
    
  • убедиться в reindex
  • , поскольку вы только хотят вернуть User объектов, то вам не нужно индексировать Location или Competence (из вашего кода выше, я не мог сказать, были ли вы ранее)
Смежные вопросы