Документация • Форум сообщества • Stack Overflow • Сообщить об ошибке • Часто задаваемые вопросы • Поддержка
Этот драгоценный камень позволяет вам легко интегрировать API поиска Algolia в ваш любимый ORM. Он основан на геме algoliasearch-client-ruby. Поддерживаются Rails 6.x и 7.x.
Вас может заинтересовать пример приложения Ruby on Rails, предоставляющего автозаполнение на основе autocomplete.js
и страницу результатов мгновенного поиска на основе InstantSearch.js
: algoliasearch-rails-example.
Вы можете найти полную ссылку на веб-сайте Algolia.
Настраивать
Использование
Параметры
objectID
Индексы
Тестирование
Поиск неисправностей
gem install algoliasearch-rails
Добавьте драгоценный камень в свой Gemfile
:
gem "algoliasearch-rails"
И запустите:
bundle install
Создайте новый файл config/initializers/algoliasearch.rb
чтобы настроить APPLICATION_ID
и API_KEY
.
AlgoliaSearch . configuration = { application_id : 'YourApplicationID' , api_key : 'YourAPIKey' }
Гем совместим с ActiveRecord, Mongoid и Sequel.
Вы можете настроить различные пороговые значения времени ожидания, установив следующие параметры во время инициализации:
AlgoliaSearch . configuration = {
application_id : 'YourApplicationID' ,
api_key : 'YourAPIKey' ,
}
Этот драгоценный камень широко использует обратные вызовы Rails для запуска задач индексации. Если вы используете методы в обход обратных вызовов after_validation
, before_save
или after_commit
, они не будут индексировать ваши изменения. Например: update_attribute
не выполняет проверки, для выполнения проверок при обновлении используйте update_attributes
.
Все методы, внедренные модулем AlgoliaSearch
, имеют префикс algolia_
и псевдонимы соответствующих коротких имен, если они еще не определены.
Contact . algolia_reindex! # <=> Contact.reindex!
Contact . algolia_search ( "jon doe" ) # <=> Contact.search("jon doe")
Следующий код создаст индекс Contact
и добавит возможности поиска в вашу модель Contact
:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
attributes :first_name , :last_name , :email
end
end
Вы можете указать атрибуты для отправки (здесь мы ограничились :first_name, :last_name, :email
) или нет (в этом случае отправляются все атрибуты).
class Product < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
# all attributes will be sent
end
end
Вы также можете использовать метод add_attribute
для отправки всех атрибутов модели + дополнительных:
class Product < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
# all attributes + extra_attr will be sent
add_attribute :extra_attr
end
def extra_attr
"extra_val"
end
end
Мы предоставляем множество способов настройки индекса, позволяющих настроить общую релевантность индекса. Наиболее важными из них являются атрибуты, доступные для поиска , и атрибуты, отражающие популярность записи .
class Product < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
# list of attribute used to build an Algolia record
attributes :title , :subtitle , :description , :likes_count , :seller_name
# the `searchableAttributes` (formerly known as attributesToIndex) setting defines the attributes
# you want to search in: here `title`, `subtitle` & `description`.
# You need to list them by order of importance. `description` is tagged as
# `unordered` to avoid taking the position of a match into account in that attribute.
searchableAttributes [ 'title' , 'subtitle' , 'unordered(description)' ]
# the `customRanking` setting defines the ranking criteria use to compare two matching
# records in case their text-relevance is equal. It should reflect your record popularity.
customRanking [ 'desc(likes_count)' ]
end
end
Чтобы проиндексировать модель, просто вызовите reindex
класса:
Product . reindex
Чтобы проиндексировать все ваши модели, вы можете сделать что-то вроде этого:
Rails . application . eager_load! # Ensure all models are loaded (required in development).
algolia_models = ActiveRecord :: Base . descendants . select { | model | model . respond_to? ( :reindex ) }
algolia_models . each ( & :reindex )
Традиционные реализации поиска, как правило, имеют логику и функциональность поиска на серверной стороне. Это имело смысл, когда процесс поиска состоял из того, что пользователь вводил поисковый запрос, выполнял этот поиск, а затем был перенаправлен на страницу результатов поиска.
Реализация поиска на серверной стороне больше не требуется. Фактически, в большинстве случаев это вредно для производительности из-за дополнительной задержки в сети и обработки. Мы настоятельно рекомендуем использовать наш клиент API JavaScript, отправляющий все поисковые запросы непосредственно из браузера, мобильного устройства или клиента конечного пользователя. Это уменьшит общую задержку поиска и одновременно разгрузит ваши серверы.
Клиент JS API является частью драгоценного камня, просто укажите algolia/v3/algoliasearch.min
где-нибудь в манифесте JavaScript, например в application.js
, если вы используете Rails 3.1+:
//= require algolia/v3/algoliasearch.min
Затем в вашем коде JavaScript вы можете сделать:
var client = algoliasearch ( ApplicationID , Search - Only - API - Key ) ;
var index = client . initIndex ( 'YourIndexName' ) ;
index . search ( 'something' , { hitsPerPage : 10 , page : 0 } )
. then ( function searchDone ( content ) {
console . log ( content )
} )
. catch ( function searchFailure ( err ) {
console . error ( err ) ;
} ) ;
Недавно (март 2015 г.) мы выпустили новую версию (V3) нашего клиента JavaScript. Если вы использовали нашу предыдущую версию (V2), прочтите руководство по миграции.
Примечания. Мы рекомендуем использовать наш клиент API JavaScript для выполнения запросов непосредственно из браузера конечного пользователя, минуя ваш сервер.
Поиск возвращает ORM-совместимые объекты, перезагружая их из вашей базы данных. Мы рекомендуем использовать наш клиент API JavaScript для выполнения запросов, чтобы уменьшить общую задержку и разгрузить ваши серверы.
hits = Contact . search ( "jon doe" )
p hits
p hits . raw_answer # to get the original JSON raw answer
Атрибут highlight_result
добавляется к каждому объекту ORM:
hits [ 0 ] . highlight_result [ 'first_name' ] [ 'value' ]
Если вы хотите получить необработанный ответ JSON из API без повторной загрузки объектов из базы данных, вы можете использовать:
json_answer = Contact . raw_search ( "jon doe" )
p json_answer
p json_answer [ 'hits' ]
p json_answer [ 'facets' ]
Параметры поиска можно указать либо через настройки индекса статически в вашей модели, либо динамически во время поиска, указав параметры поиска в качестве второго аргумента метода search
:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
attribute :first_name , :last_name , :email
# default search parameters stored in the index settings
minWordSizefor1Typo 4
minWordSizefor2Typos 8
hitsPerPage 42
end
end
# dynamical search parameters
p Contact . raw_search ( 'jon doe' , { hitsPerPage : 5 , page : 2 } )
Даже если мы настоятельно рекомендуем выполнять все операции поиска (и, следовательно, разбивки на страницы) из вашего внешнего интерфейса с помощью JavaScript , мы поддерживаем как will_paginate, так и kaminari в качестве серверной части разбивки на страницы.
Чтобы использовать :will_paginate
, укажите :pagination_backend
следующим образом:
AlgoliaSearch . configuration = { application_id : 'YourApplicationID' , api_key : 'YourAPIKey' , pagination_backend : :will_paginate }
Затем, как только вы воспользуетесь методом search
, возвращаемые результаты будут разбиты на страницы:
# in your controller
@results = MyModel . search ( 'foo' , hitsPerPage : 10 )
# in your views
# if using will_paginate
<%= will_paginate @results %>
# if using kaminari
<%= paginate @results %>
Используйте метод tags
, чтобы добавить теги к вашей записи:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
tags [ 'trusted' ]
end
end
или используя динамические значения:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
tags do
[ first_name . blank? || last_name . blank? ? 'partial' : 'full' , has_valid_email? ? 'valid_email' : 'invalid_email' ]
end
end
end
Во время запроса укажите { tagFilters: 'tagvalue' }
или { tagFilters: ['tagvalue1', 'tagvalue2'] }
в качестве параметров поиска, чтобы ограничить набор результатов определенными тегами.
Фасеты можно получить, вызвав метод дополнительных facets
ответа на поиск.
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
# [...]
# specify the list of attributes available for faceting
attributesForFaceting [ :company , :zip_code ]
end
end
hits = Contact . search ( 'jon doe' , { facets : '*' } )
p hits # ORM-compliant array of objects
p hits . facets # extra method added to retrieve facets
p hits . facets [ 'company' ] # facet values+count of facet 'company'
p hits . facets [ 'zip_code' ] # facet values+count of facet 'zip_code'
raw_json = Contact . raw_search ( 'jon doe' , { facets : '*' } )
p raw_json [ 'facets' ]
Вы также можете искать значения фасетов.
Product . search_for_facet_values ( 'category' , 'Headphones' ) # Array of {value, highlighted, count}
Этот метод также может принимать любой параметр, который может принимать запрос. Это позволит настроить поиск только на совпадения, соответствующие запросу.
# Only sends back the categories containing red Apple products (and only counts those)
Product . search_for_facet_values ( 'category' , 'phone' , {
query : 'red' ,
filters : 'brand:Apple'
} ) # Array of phone categories linked to red Apple products
Дополнительную информацию о различных группировках можно найти здесь.
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
# [...]
# specify the attribute to be used for distinguishing the records
# in this case the records will be grouped by company
attributeForDistinct "company"
end
end
Используйте метод geoloc
для локализации вашей записи:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
geoloc :lat_attr , :lng_attr
end
end
Во время запроса укажите { aroundLatLng: "37.33, -121.89", aroundRadius: 50000 }
в качестве параметров поиска, чтобы ограничить набор результатов 50 км вокруг Сан-Хосе.
Каждый раз, когда запись сохраняется, она будет асинхронно индексироваться. С другой стороны, каждый раз, когда запись уничтожается, она будет асинхронно удалена из индекса. Это означает, что сетевой вызов с операцией ADD/DELETE отправляется синхронно в API Algolia, но затем движок будет асинхронно обрабатывать операцию (поэтому, если вы выполните поиск сразу после этого, результаты могут еще не отразить это).
Вы можете отключить автоматическое индексирование и автоматическое удаление, установив следующие параметры:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch auto_index : false , auto_remove : false do
attribute :first_name , :last_name , :email
end
end
Вы можете временно отключить автоиндексацию, используя область without_auto_index
. Это часто используется из соображений производительности.
Contact . delete_all
Contact . without_auto_index do
1 . upto ( 10000 ) { Contact . create! attributes } # inside this block, auto indexing task will not run.
end
Contact . reindex! # will use batch operations
Вы можете настроить процесс автоматического индексирования и автоматического удаления, чтобы использовать очередь для выполнения этих операций в фоновом режиме. Очереди ActiveJob (Rails >=4.2) используются по умолчанию, но вы можете определить свой собственный механизм организации очередей:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch enqueue : true do # ActiveJob will be triggered using a `algoliasearch` queue
attribute :first_name , :last_name , :email
end
end
Если вы выполняете обновления и удаления в фоновом режиме, удаление записи может быть зафиксировано в вашей базе данных до фактического выполнения задания. Таким образом, если вы загрузите запись, чтобы удалить ее из базы данных, ваш ActiveRecord#find завершится с ошибкой RecordNotFound.
В этом случае вы можете не загружать запись из ActiveRecord и просто напрямую обращаться к индексу:
class MySidekiqWorker
def perform ( id , remove )
if remove
# the record has likely already been removed from your database so we cannot
# use ActiveRecord#find to load it
index = AlgoliaSearch . client . init_index ( "index_name" )
index . delete_object ( id )
else
# the record should be present
c = Contact . find ( id )
c . index!
end
end
end
Если вы используете Sidekiq:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch enqueue : :trigger_sidekiq_worker do
attribute :first_name , :last_name , :email
end
def self . trigger_sidekiq_worker ( record , remove )
MySidekiqWorker . perform_async ( record . id , remove )
end
end
class MySidekiqWorker
def perform ( id , remove )
if remove
# the record has likely already been removed from your database so we cannot
# use ActiveRecord#find to load it
index = AlgoliaSearch . client . init_index ( "index_name" )
index . delete_object ( id )
else
# the record should be present
c = Contact . find ( id )
c . index!
end
end
end
Если вы используете задержанную_работу:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch enqueue : :trigger_delayed_job do
attribute :first_name , :last_name , :email
end
def self . trigger_delayed_job ( record , remove )
if remove
record . delay . remove_from_index!
else
record . delay . index!
end
end
end
Вы можете принудительно синхронизировать индексацию и удаление (в этом случае драгоценный камень вызовет метод wait_task
, чтобы гарантировать, что операция была учтена после возврата метода), установив следующую опцию: (это НЕ рекомендуется, за исключением целей тестирования). )
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch synchronous : true do
attribute :first_name , :last_name , :email
end
end
По умолчанию именем индекса будет имя класса, например «Контакт». Вы можете настроить имя индекса, используя опцию index_name
:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch index_name : "MyCustomName" do
attribute :first_name , :last_name , :email
end
end
Вы можете добавить к имени индекса суффикс текущей среды Rails, используя следующую опцию:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch per_environment : true do # index name will be "Contact_#{Rails.env}"
attribute :first_name , :last_name , :email
end
end
Вы можете использовать блок для указания сложного значения атрибута.
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
attribute :email
attribute :full_name do
" #{ first_name } #{ last_name } "
end
add_attribute :full_name2
end
def full_name2
" #{ first_name } #{ last_name } "
end
end
Примечания: Как только вы используете такой код для определения дополнительных атрибутов, драгоценный камень больше не может определить, изменился ли атрибут (для обнаружения этого код использует метод Rails #{attribute}_changed?
). Как следствие, ваша запись будет передана в API, даже если ее атрибуты не изменились. Вы можете обойти это поведение, создав _changed?
метод:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch do
attribute :email
attribute :full_name do
" #{ first_name } #{ last_name } "
end
end
def full_name_changed?
first_name_changed? || last_name_changed?
end
end
Вы можете легко встраивать вложенные объекты, определяя дополнительный атрибут, возвращающий любой JSON-совместимый объект (массив, хеш или комбинацию того и другого).
class Profile < ActiveRecord :: Base
include AlgoliaSearch
belongs_to :user
has_many :specializations
algoliasearch do
attribute :user do
# restrict the nested "user" object to its `name` + `email`
{ name : user . name , email : user . email }
end
attribute :public_specializations do
# build an array of public specialization (include only `title` and `another_attr`)
specializations . select { | s | s . public? } . map do | s |
{ title : s . title , another_attr : s . another_attr }
end
end
end
end
В ActiveRecord для достижения этой цели мы будем использовать touch
и after_touch
.
# app/models/app.rb
class App < ApplicationRecord
include AlgoliaSearch
belongs_to :author , class_name : :User
after_touch :index!
algoliasearch do
attribute :title
attribute :author do
author . as_json
end
end
end
# app/models/user.rb
class User < ApplicationRecord
# If your association uses belongs_to
# - use `touch: true`
# - do not define an `after_save` hook
has_many :apps , foreign_key : :author_id
after_save { apps . each ( & :touch ) }
end
В Sequel вы можете использовать touch
плагин для распространения изменений:
# app/models/app.rb
class App < Sequel :: Model
include AlgoliaSearch
many_to_one :author , class : :User
plugin :timestamps
plugin :touch
algoliasearch do
attribute :title
attribute :author do
author . to_hash
end
end
end
# app/models/user.rb
class User < Sequel :: Model
one_to_many :apps , key : :author_id
plugin :timestamps
# Can't use the associations since it won't trigger the after_save
plugin :touch
# Define the associations that need to be touched here
# Less performant, but allows for the after_save hook to trigger
def touch_associations
apps . map ( & :touch )
end
def touch
super
touch_associations
end
end
objectID
По умолчанию objectID
основан на id
вашей записи. Вы можете изменить это поведение, указав параметр :id
(обязательно используйте поле uniq).
class UniqUser < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch id : :uniq_name do
end
end
Вы можете добавить ограничения, определяющие, должна ли запись индексироваться, используя параметры :if
или :unless
.
Это позволяет вам выполнять условное индексирование для каждого документа.
class Post < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch if : :published? , unless : :deleted? do
end
def published?
# [...]
end
def deleted?
# [...]
end
end
Примечания. Как только вы используете эти ограничения, будут выполняться вызовы addObjects
и deleteObjects
, чтобы синхронизировать индекс с БД (гем без состояния не знает, не соответствует ли объект вашим ограничениям или никогда не совпадал). , поэтому мы принудительно отправляем операции ADD/DELETE). Вы можете обойти это поведение, создав _changed?
метод:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch if : :published do
end
def published
# true or false
end
def published_changed?
# return true only if you know that the 'published' state changed
end
end
Вы можете индексировать подмножество своих записей, используя:
# will generate batch API calls (recommended)
MyModel . where ( 'updated_at > ?' , 10 . minutes . ago ) . reindex!
или
MyModel . index_objects MyModel . limit ( 5 )
Вы можете очистить все свои атрибуты, используя опцию sanitize
. Он удалит все HTML-теги из ваших атрибутов.
class User < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch per_environment : true , sanitize : true do
attributes :name , :email , :company
end
end
Если вы используете Rails 4.2+, вам также необходимо использовать rails-html-sanitizer
:
gem 'rails-html-sanitizer'
Вы можете принудительно использовать кодировку UTF-8 для всех своих атрибутов, используя опцию force_utf8_encoding
:
class User < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch force_utf8_encoding : true do
attributes :name , :email , :company
end
end
Примечания. Этот параметр несовместим с Ruby 1.8.
Вы можете отключить исключения, которые могут возникнуть при попытке доступа к API Algolia, используя опцию raise_on_failure
:
class Contact < ActiveRecord :: Base
include AlgoliaSearch
# only raise exceptions in development env
algoliasearch raise_on_failure : Rails . env . development? do
attribute :first_name , :last_name , :email
end
end
Вот пример конфигурации реального слова (из HN Search):
class Item < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch per_environment : true do
# the list of attributes sent to Algolia's API
attribute :created_at , :title , :url , :author , :points , :story_text , :comment_text , :author , :num_comments , :story_id , :story_title
# integer version of the created_at datetime field, to use numerical filtering
attribute :created_at_i do
created_at . to_i
end
# `title` is more important than `{story,comment}_text`, `{story,comment}_text` more than `url`, `url` more than `author`
# btw, do not take into account position in most fields to avoid first word match boost
searchableAttributes [ 'unordered(title)' , 'unordered(story_text)' , 'unordered(comment_text)' , 'unordered(url)' , 'author' ]
# tags used for filtering
tags do
[ item_type , "author_ #{ author } " , "story_ #{ story_id } " ]
end
# use associated number of HN points to sort results (last sort criteria)
customRanking [ 'desc(points)' , 'desc(num_comments)' ]
# google+, $1.5M raises, C#: we love you
separatorsToIndex '+#$'
end
def story_text
item_type_cd != Item . comment ? text : nil
end
def story_title
comment? && story ? story . title : nil
end
def story_url
comment? && story ? story . url : nil
end
def comment_text
comment? ? text : nil
end
def comment?
item_type_cd == Item . comment
end
# [...]
end
Вы можете запустить индексацию, используя index!
метод экземпляра.
c = Contact . create! ( params [ :contact ] )
c . index!
И инициировать удаление индекса с помощью команды remove_from_index!
метод экземпляра.
c . remove_from_index!
c . destroy
Гем предоставляет 2 способа переиндексации всех ваших объектов:
Чтобы переиндексировать все ваши записи (с учетом удаленных объектов), метод класса reindex
индексирует все ваши объекты во временный индекс с именем <INDEX_NAME>.tmp
и перемещает временный индекс в окончательный, как только все будет проиндексировано (атомарно). Это самый безопасный способ переиндексировать весь ваш контент.
Contact . reindex
Примечания . Если вы используете ключ API, специфичный для индекса, убедитесь, что вы разрешаете как <INDEX_NAME>
, так и <INDEX_NAME>.tmp
.
Предупреждение. Не следует использовать такую операцию атомарного переиндексирования при определении области действия/фильтрации модели, поскольку эта операция заменяет весь индекс , сохраняя только отфильтрованные объекты. то есть: не делайте MyModel.where(...).reindex
, а делайте MyModel.where(...).reindex!
(с хвостиком !
)!!!
Чтобы переиндексировать все ваши объекты на месте (без временного индекса и, следовательно, без удаления удаленных объектов), используйте команду reindex!
метод класса:
Contact . reindex!
Чтобы очистить индекс, используйте clear_index!
метод класса:
Contact . clear_index!
Вы можете получить доступ к базовому объекту index
, вызвав метод класса index
:
index = Contact . index
# index.get_settings, index.partial_update_object, ...
Вы можете определить индексы реплик, используя метод add_replica
. Используйте inherit: true
в блоке реплики, если вы хотите, чтобы он наследовался от основных настроек.
class Book < ActiveRecord :: Base
attr_protected
include AlgoliaSearch
algoliasearch per_environment : true do
searchableAttributes [ :name , :author , :editor ]
# define a replica index to search by `author` only
add_replica 'Book_by_author' , per_environment : true do
searchableAttributes [ :author ]
end
# define a replica index with custom ordering but same settings than the main block
add_replica 'Book_custom_order' , inherit : true , per_environment : true do
customRanking [ 'asc(rank)' ]
end
end
end
Для поиска с использованием реплики используйте следующий код:
Book . raw_search 'foo bar' , replica : 'Book_by_editor'
# or
Book . search 'foo bar' , replica : 'Book_by_editor'
Может иметь смысл использовать общий индекс для нескольких моделей. Чтобы реализовать это, вам необходимо убедиться, что у вас нет конфликта с objectID
базовых моделей.
class Student < ActiveRecord :: Base
attr_protected
include AlgoliaSearch
algoliasearch index_name : 'people' , id : :algolia_id do
# [...]
end
private
def algolia_id
"student_ #{ id } " # ensure the teacher & student IDs are not conflicting
end
end
class Teacher < ActiveRecord :: Base
attr_protected
include AlgoliaSearch
algoliasearch index_name : 'people' , id : :algolia_id do
# [...]
end
private
def algolia_id
"teacher_ #{ id } " # ensure the teacher & student IDs are not conflicting
end
end
Примечания. Если вы ориентируетесь на один индекс из нескольких моделей, вы никогда не должны использовать MyModel.reindex
, а только MyModel.reindex!
. Метод reindex
использует временный индекс для выполнения атомарной переиндексации: если вы его используете, результирующий индекс будет содержать только записи для текущей модели, поскольку он не будет переиндексировать остальные.
Индексировать запись в нескольких индексах можно с помощью метода add_index
:
class Book < ActiveRecord :: Base
attr_protected
include AlgoliaSearch
PUBLIC_INDEX_NAME = "Book_ #{ Rails . env } "
SECURED_INDEX_NAME = "SecuredBook_ #{ Rails . env } "
# store all books in index 'SECURED_INDEX_NAME'
algoliasearch index_name : SECURED_INDEX_NAME do
searchableAttributes [ :name , :author ]
# convert security to tags
tags do
[ released ? 'public' : 'private' , premium ? 'premium' : 'standard' ]
end
# store all 'public' (released and not premium) books in index 'PUBLIC_INDEX_NAME'
add_index PUBLIC_INDEX_NAME , if : :public? do
searchableAttributes [ :name , :author ]
end
end
private
def public?
released && ! premium
end
end
Для поиска с использованием дополнительного индекса используйте следующий код:
Book . raw_search 'foo bar' , index : 'Book_by_editor'
# or
Book . search 'foo bar' , index : 'Book_by_editor'
Чтобы запустить спецификации, установите переменные среды ALGOLIA_APPLICATION_ID
и ALGOLIA_API_KEY
. Поскольку тесты создают и удаляют индексы, НЕ используйте свою производственную учетную запись.
Возможно, вы захотите отключить все вызовы API индексирования (операции добавления, обновления и удаления). Вы можете установить параметр disable_indexing
:
class User < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch per_environment : true , disable_indexing : Rails . env . test? do
end
end
class User < ActiveRecord :: Base
include AlgoliaSearch
algoliasearch per_environment : true , disable_indexing : Proc . new { Rails . env . test? || more_complex_condition } do
end
end
Возникла проблема? Прежде чем обращаться в службу поддержки, мы рекомендуем зайти в раздел часто задаваемых вопросов, где вы найдете ответы на наиболее распространенные проблемы и затруднения с клиентом.
Если вы хотите внести свой вклад в этот проект, не устанавливая все его зависимости, вы можете использовать наш образ Docker. Пожалуйста, ознакомьтесь с нашим специальным руководством, чтобы узнать больше.