Reputation: 12189
I use Elasticsearch in my Rails application (elasticsearch-model, elasticsearch-rails gems). I wrote a simple search:
def search
@posts = params[:term] ? Post.search(params[:term]) : []
render json: @posts
end
It works good. But I made some fixes in order to do search among 'deleted=false' and 'enabled=true' subset then :
def search
@posts = params[:term] ? Post.existing.enabled.search(params[:term]) : []
render json: @posts
end
Post
class Post < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
scope :existing, ->{ where(deleted: false) }
scope :enabled, ->{ where(enabled: true) }
end
Post.import
It doesn't work - I see the same results as in the previous case(with any value in 'deleted' and 'existing' columns. How can I fix it? Thanks in advance.
Upvotes: 4
Views: 1572
Reputation: 84
def self.search query, options = {}
search_definition = {
query: {},
filter: {}
}
__add_filter = lambda do |f|
search_definition[:filter][:and] ||= []
search_definition[:filter][:and] |= [f]
end
if options[:existing]
__add_filter.({ term: {'deleted' => false}})
end
if options[:enabled]
__add_filter.({ term: {'enabled' => true}})
end
unless query.blank?
search_definition[:query] = {
# add your query logic
}
else
search_definition[:query] = { match_all: {}}
end
__elasticsearch__.search(search_definition)
end
Upvotes: 0
Reputation: 6100
Change how your search
method works.
@posts = params[:term] ? Post.search(params[:term], existing: true, enabled: true) : []
Post model
def self.search query, options = {}
__add_filter = lambda do |f|
search_definition[:filter][:and] ||= []
search_definition[:filter][:and] |= [f]
end
search_definition = {
query: {},
filter: {}
}
if options[:existing]
__add_filter.({ term: {'deleted' => false}})
end
if options[:enabled]
__add_filter.({ term: {'enabled' => true}})
end
unless query.blank?
search_definition[:query] = {
# add your query logic
}
else
search_definition[:query] = { match_all: {}}
end
__elasticsearch__.search(search_definition)
end
You could also check elastic_search example
Upvotes: 3