forked from elastic/elasticsearch-rails
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.rb
85 lines (80 loc) · 3.39 KB
/
search.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
module Elasticsearch
module Persistence
module Repository
# Returns a collection of domain objects by an Elasticsearch query
#
module Search
# Returns a collection of domain objects by an Elasticsearch query
#
# Pass the query either as a string or a Hash-like object
#
# @example Return objects matching a simple query
#
# repository.search('fox or dog')
#
# @example Return objects matching a query in the Elasticsearch DSL
#
# repository.search(query: { match: { title: 'fox dog' } })
#
# @example Define additional search parameters, such as highlighted excerpts
#
# results = repository.search(query: { match: { title: 'fox dog' } }, highlight: { fields: { title: {} } })
# results.map_with_hit { |d,h| h.highlight.title.join }
# # => ["quick brown <em>fox</em>", "fast white <em>dog</em>"]
#
# @example Perform aggregations as part of the request
#
# results = repository.search query: { match: { title: 'fox dog' } },
# aggregations: { titles: { terms: { field: 'title' } } }
# results.response.aggregations.titles.buckets.map { |term| "#{term['key']}: #{term['doc_count']}" }
# # => ["brown: 1", "dog: 1", ... ]
#
# @example Pass additional options to the search request, such as `size`
#
# repository.search query: { match: { title: 'fox dog' } }, size: 25
# # GET http://localhost:9200/notes/note/_search
# # > {"query":{"match":{"title":"fox dog"}},"size":25}
#
# @return [Elasticsearch::Persistence::Repository::Response::Results]
#
def search(query_or_definition, options={})
type = document_type || (klass ? __get_type_from_class(klass) : nil )
case
when query_or_definition.respond_to?(:to_hash)
response = client.search( { index: index_name, type: type, body: query_or_definition.to_hash }.merge(options) )
when query_or_definition.is_a?(String)
response = client.search( { index: index_name, type: type, q: query_or_definition }.merge(options) )
else
raise ArgumentError, "[!] Pass the search definition as a Hash-like object or pass the query as a String" +
" -- #{query_or_definition.class} given."
end
Response::Results.new(self, response)
end
# Return the number of domain object in the index
#
# @example Return the number of all domain objects
#
# repository.count
# # => 2
#
# @example Return the count of domain object matching a simple query
#
# repository.count('fox or dog')
# # => 1
#
# @example Return the count of domain object matching a query in the Elasticsearch DSL
#
# repository.search(query: { match: { title: 'fox dog' } })
# # => 1
#
# @return [Integer]
#
def count(query_or_definition=nil, options={})
query_or_definition ||= { query: { match_all: {} } }
response = search query_or_definition, options.update(search_type: 'count')
response.response.hits.total
end
end
end
end
end