Cloudsearchable
An ActiveRecord-style ORM query interface for AWS CloudSearch.
Install / Use
/learn @amazon-archives/CloudsearchableREADME
Cloudsearchable
An ActiveRecord-style ORM query interface for Amazon CloudSearch.
Installation
Add to your Gemfile: gem 'cloudsearchable'. Run bundle or: gem install cloudsearchable.
Usage
1. Mix Cloudsearchable into your class
class Customer
include Cloudsearchable
attr_accessor :id, :customer, :name, :lock_version
# This is the default index. You probably only need one.
index_in_cloudsearch do |idx|
# Fetch the customer_id field from customer
literal :customer_id, :result_enabled => true, :search_enabled => true, :source => Proc.new { customer }
# Map the 'name' Ruby attribute to a field called 'test_name'
text :test_name, :result_enabled => false, :search_enabled => true, :source => :name
# uint fields can be used in result ranking functions
uint :helpfulness, :result_enabled => true, :search_enabled => false do; 1234 end
end
# A named index.
index_in_cloudsearch :test_index do |idx|
literal :id, :search_enabled => true
end
end
2. Index some objects
c = Customer.new
c.add_to_indexes
c.update_indexes
c.remove_from_indexes
3. Start querying
Customer.search.where(customer_id: 12345)
Customer.search.where(customer_id: 12345).order('-helpfulness') # ordering
Customer.search.where(customer_id: 12345).limit(10) # limit, default 100000
Customer.search.where(customer_id: 12345).offset(100) # offset
Customer.search.where(customer_id: 12345).found_count # count
Customer.search.where(customer_id: 12345).where(helpfulness: 42) # query chain
Customer.search.where(customer_id: 12345, helpfulness: 42) # query chain from hash
Customer.search.where(:category, :any, ["big", "small"]) # multiple values
Customer.search.where(:customer_id, :!=, 1234) # "not equal to" operator
Customer.search.text('test') # text search
Customer.search.text('test').where(:featured, :==, 'f') # text search with other fields
Customer.search.where(:helpfulness, :within_range, 0..123) # uint range query, string range works too
Customer.search.where(:helpfulness, :>, 123) # uint greather than
Customer.search.where(:helpfulness, :>=, 123) # uint greather than or equal to
Customer.search.where(:helpfulness, :<, 123) # uint less than
Customer.search.where(:helpfulness, :<=, 123) # uint less than or equal to
These queries return a Cloudsearchable::Query, calling .to_a or .found_count will fetch the results
Customer.search.where(customer_id: 12345).each |customer|
p "#{customer.class}: #{customer.name}"
end
# Customer: foo
# Customer: bar
Configuration
# config\initializers\cloudsearchable_config.rb
require 'cloudsearchable'
Cloudsearchable.configure do |config|
config.domain_prefix = "dev-lane-"
end
Supported Options
- domain_prefix - A name prefix string for your domains in CloudSearch. Defaults to Rails.env, or "" if Rails is undefined.
- config.fatal_warnings - raises WarningInQueryResult exception on warning. Defaults to false.
- config.logger - a custom logger, defaults to Rails if defined.
ActiveSupport Notifications
Requests to AWS cloudsearch are instrumented using ActiveSupport Notifications. To consume these instrumented events register a subscriber in your Application. For example, to register for getting notifications for search requests:
ActiveSupport::Notifications.subscribe('cloudsearchable.execute_query') do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
# Your code here ...
end
Instrumented events:
- cloudsearchable.execute_query - Instruments search requests
- cloudsearchable.post_record - Instruments record addition
- cloudsearchable.delete_record - Instruments record deletion
- cloudsearchable.describe_domains - Instruments request for getting domains information
Other Features
Cloudsearchable provides access the underlying AWS client objects, such as '''CloudSearch.client''' and '''class.cloudsearch_domains'''. For example here is how to drop domains associated with Customer class:
client = CloudSearch.client
Customer.cloudsearch_domains.each do |key, domain|
domain_name = domain.name
puts "...dropping #{domain_name}"
client.delete_domain(:domain_name => domain_name)
end
See spec tests and source code for more information.
Credits
Apache 2.0 License
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Run the tests (
rake spec) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request
Related Skills
node-connect
351.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
