เอกสารประกอบ • ฟอรัมชุมชน • สแต็กโอเวอร์โฟลว์ • รายงานข้อผิดพลาด • คำถามที่พบบ่อย • การสนับสนุน
Gem นี้ช่วยให้คุณสามารถรวม Algolia Search API เข้ากับ 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
callbacks มันจะไม่สร้างดัชนีการเปลี่ยนแปลงของคุณ ตัวอย่างเช่น: 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 )
การใช้งานการค้นหาแบบดั้งเดิมมักจะมีตรรกะการค้นหาและฟังก์ชันการทำงานอยู่ที่แบ็กเอนด์ การดำเนินการนี้สมเหตุสมผลเมื่อประสบการณ์การค้นหาประกอบด้วยผู้ใช้ที่ป้อนคำค้นหา ดำเนินการค้นหานั้น จากนั้นถูกเปลี่ยนเส้นทางไปยังหน้าผลการค้นหา
การดำเนินการค้นหาบนแบ็กเอนด์ไม่จำเป็นอีกต่อไป ในความเป็นจริง ในกรณีส่วนใหญ่ สิ่งนี้จะเป็นอันตรายต่อประสิทธิภาพการทำงานเนื่องจากเครือข่ายที่เพิ่มขึ้นและเวลาในการตอบสนองในการประมวลผล เราขอแนะนำเป็นอย่างยิ่งให้ใช้ไคลเอนต์ JavaScript API ของเราเพื่อออกคำขอค้นหาทั้งหมดโดยตรงจากเบราว์เซอร์ อุปกรณ์มือถือ หรือไคลเอนต์ของผู้ใช้ปลายทาง มันจะลดเวลาแฝงในการค้นหาโดยรวมในขณะที่ลดการโหลดเซิร์ฟเวอร์ของคุณในเวลาเดียวกัน
ไคลเอ็นต์ JS API เป็นส่วนหนึ่งของ gem เพียงต้องการ 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 ) ;
} ) ;
เมื่อเร็วๆ นี้ (มีนาคม 2558) เราได้เปิดตัวไคลเอนต์ JavaScript เวอร์ชันใหม่ (V3) หากคุณใช้เวอร์ชันก่อนหน้า (V2) โปรดอ่านคู่มือการย้ายข้อมูล
หมายเหตุ: เราขอแนะนำให้ใช้ไคลเอนต์ JavaScript API ของเราเพื่อทำการสืบค้นโดยตรงจากเบราว์เซอร์ผู้ใช้ปลายทางโดยไม่ต้องผ่านเซิร์ฟเวอร์ของคุณ
การค้นหาส่งคืนออบเจ็กต์ที่สอดคล้องกับ ORM โดยโหลดซ้ำจากฐานข้อมูลของคุณ เราขอแนะนำให้ใช้ไคลเอนต์ JavaScript API ของเราในการสืบค้นเพื่อลดเวลาแฝงโดยรวมและลดภาระเซิร์ฟเวอร์ของคุณ
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 สามารถดึงข้อมูลได้โดยเรียกใช้วิธี 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}
วิธีนี้ยังสามารถรับพารามิเตอร์ใดก็ได้ที่แบบสอบถามสามารถทำได้ วิธีนี้จะปรับการค้นหาให้เฉพาะ Hit ที่จะตรงกับข้อความค้นหาเท่านั้น
# 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 }
เป็นพารามิเตอร์การค้นหาเพื่อจำกัดผลลัพธ์ที่ตั้งค่าไว้ที่ 50KM รอบซานโฮเซ
แต่ละครั้งที่มีการบันทึกบันทึก บันทึกนั้นจะถูกจัดทำดัชนี แบบอะซิงโครนัส ในทางกลับกัน แต่ละครั้งที่บันทึกถูกทำลาย บันทึกจะถูกลบออกจากดัชนีแบบอะซิงโครนัส นั่นหมายความว่าการเรียกเครือข่ายที่มีการดำเนินการ ADD/DELETE จะถูกส่ง พร้อมกัน ไปยัง Algolia API แต่กลไกจะประมวลผลการดำเนินการ แบบอะซิงโครนัส (ดังนั้นหากคุณทำการค้นหาหลังจากนั้น ผลลัพธ์อาจยังไม่สะท้อนให้เห็น)
คุณสามารถปิดใช้งานการตั้งค่าการจัดทำดัชนีอัตโนมัติและการลบอัตโนมัติได้โดยใช้ตัวเลือกต่อไปนี้:
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
คุณสามารถบังคับให้การจัดทำดัชนีและการลบเป็นแบบซิงโครนัส (ในกรณีนี้ gem จะเรียกใช้เมธอด 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
หมายเหตุ: ทันทีที่คุณใช้โค้ดดังกล่าวเพื่อกำหนดแอตทริบิวต์เพิ่มเติม อัญมณีจะไม่สามารถตรวจพบได้อีกต่อไปว่าแอตทริบิวต์มีการเปลี่ยนแปลงหรือไม่ (โค้ดใช้วิธี #{attribute}_changed?
ของ Rails เพื่อตรวจจับสิ่งนั้น) ด้วยเหตุนี้ บันทึกของคุณจึงถูกส่งไปยัง 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 ของเราได้ โปรดตรวจสอบคำแนะนำเฉพาะของเราเพื่อเรียนรู้เพิ่มเติม