2016-01-15 3 views
1

Я строю поиск с использованием рельсов Algolia, но с трудностями при выполнении сортировки динамически. Например, пользователь может выбрать из выпадающего списка для сортировки по цене asc или цене desc.Рельсы Algolia sortBy динамически

Вот моя модель, в которой я определил индексы

class Product < ActiveRecord::Base 
    include AlgoliaSearch 

    algoliasearch per_environment: true, if: :publishable? do 
    attribute :id, :name, :description, :seller_id, :condition, :location, :slug, :status, :city, :state, :stock_quantity, 
     :shipping_method, :price 
    attribute :created_at_i do 
     created_at.to_i 
    end 
    attribute :updated_at_i do 
     updated_at.to_i 
    end 
    attribute :price do 
     price.to_f 
    end 
    attributesToIndex ['name', 'unordered(description)', 'seller_id', 
     'condition', 'location', 'slug', 'created_at', 'updated_at', 'status', 
     'geo(city)', 'geo(state)'] 
    geoloc :latitude, :longitude 
    numericAttributesToIndex ["price", "stock_quantity"] 
    attributesForFaceting ['price', 'condition', 'shipping_method'] 
    end 

и контроллер продуктов

def index 
queries = { hitsPerPage: 5, page: params[:page].to_i, facets: '*', 
     facetFilters: [ 
     "condition: #{params[:condition]}", 
     "shipping_method: #{params[:shipping_method]}" 
     ], 
     numericFilters: [ 
     "price:#{params[:min_price] || 0} to #{params[:max_price] || 999999999999999}" 
     ], 
     sortBy: ["asc(price)"] 
    } 

    if latLng.present? 
     queries[:aroundLatLng] = latLng 
     queries[:aroundRadius] = radius 
    end 


    @response = Product.search(params[:query],queries) 

Algolia возвращает ошибку "неверный параметр SortBy". Я попытался найти документацию по альголии, но не смог найти никакой информации. Спасибо за помощь.

ответ

2

Вот список соответствующих страниц документации с сайта Algolia, который поможет вам понять, как ранжирование работы Algolia по:

  • [Getting started] Tweak Ranking and Relevance

    Причина наш двигатель так быстро, потому что каждый индекс имеет свои собственные настройки и рейтинги. Это означает, что вы можете создавать различные наборы атрибутов поиска и релевантность ранжирования атрибутов, сохраняя свои данные по нескольким индексам. Это выполняется с использованием ведомых индексов, которые легко синхронизируются с основным индексом. Затем каждый подчиненный индекс может быть сконфигурирован с собственным набором бизнес-показателей для настройки расчета релевантности.

    У индекса есть специальная формула ранжирования, которая не может быть изменена. Однако вы можете легко преодолеть это ограничение, используя ведомые индексы с другой формулой ранжирования.

  • [Tutorials][Ranking Formula] Tie Breaking algorithm
    [FAQ] How does Algolia's tie breaking algorithm work?
    Эти две ссылки помогут вам понять, как ранжирование с Algolia работы и как вы можете настроить его. В принципе, в зависимости от вашего прецедента, сортировка по цене до актуальности текста на самом деле не имеет смысла. Таким образом, в зависимости от вашего варианта использования вы можете просто изменить свой customRanking на price, или вы можете добавить атрибут price в верхней части своей формулы рейтинга.

  • [FAQ] What are slave indices and what are their benefits?
    Эта последняя ссылка более подробно объясняет, что такое «рабский индекс» для Алголии.
  • [Rails documentation] Multiple sort criteria
    [Rails GitHub documentation] Master/Slave
    На этих последних ссылок, вы найдете примеры кода с помощью клиента Rails Algolia с несколькими ведомыми. Первый на самом деле демонстрирует именно ваш прецедент: сортировка по цене.

При всем этом в виду, в конце концов, вы просто хотите, чтобы добавить их в модели (если вы хотите использовать customRanking путь):

add_slave 'Product_by_price_asc', per_environment: true do 
    customRanking ['asc(price)'] 
end 

add_slave 'Product_by_price_desc', per_environment: true do 
    customRanking ['desc(price)'] 
end 

Тогда в контроллере , вы можете запросить их таким образом

query_params = { slave: "Product_by_price_#{params[:sort_order]}", hitsPerPage: 5, ... } 
Product.search params[:query], query_params 

вы, вероятно, следует также сделать эту реализацию в переднем конце, чтобы иметь возможность в полной мере использовать мгновенные возможности поиска Algolia, см [FAQ] Searching from the front-end or the back-end.

Смежные вопросы