module Elastics::SearchQuery

Helpers to build search query.

class Query
  include Elastics::SearchQuery

  # implement any of:
  #   query, phrase_query, query_filters, post_filter, aggregations

  def phrase_query
    {bool: {should: [
      {multi_match: {
        # ...
      }}
    ]}}
    # or just
    {math: {message: params[:query_string]}}
  end

  def query_filters
    [
      {term: {published: true}},
      terms_array_query(:tag, params[:tags], execution: :and),
      some_complex_filter,
    ]
  end

  def aggregations
    {
      tag: {terms: {
        field:      :tag,
        size:       10,
        shard_size: 10,
      }},
    }
  end
end

result = Model.search_elastics Query.new(params).as_json

Attributes

params[R]

Public Class Methods

new(params) click to toggle source
# File lib/elastics/search_query.rb, line 45
def initialize(params)
  @params = params
end

Public Instance Methods

aggregations() click to toggle source
# File lib/elastics/search_query.rb, line 81
def aggregations
end
as_json() click to toggle source
# File lib/elastics/search_query.rb, line 49
def as_json
  page = params[:page] || 1
  per_page = params[:per_page] || 10
  result = {
    from:         (page - 1) * per_page,
    size:         per_page,
    fields:       [],
    query:        query,
    sort:         sort,
  }
  post_filter = self.post_filter
  result[:post_filter] = post_filter if post_filter
  aggregations = self.aggregations
  result[:aggregations] = aggregations if aggregations
  result
end
phrase_query() click to toggle source
# File lib/elastics/search_query.rb, line 71
def phrase_query
end
post_filter() click to toggle source
# File lib/elastics/search_query.rb, line 78
def post_filter
end
query() click to toggle source

Builds query from phrase_query & query_filters.

# File lib/elastics/search_query.rb, line 67
def query
  normalize_query(phrase_query, query_filters.compact)
end
query_filters() click to toggle source
# File lib/elastics/search_query.rb, line 74
def query_filters
  []
end
sort() click to toggle source

Takes `params` and returns it compatible with elastics. Wraps scalars into array, hashes are converted into arrays, array are passed as is.

{name: :asc, _score: :desc} => [{name: :asc}, {_score: :desc}]
:created_at => [:created_at]
# File lib/elastics/search_query.rb, line 90
def sort
  val = params[:sort]
  case val
  when Hash   then val.map { |x| Hash[[x]] }
  when Array  then val
  else val ? [val] : []
  end
end