11
11
__all__ = ['FacetedSearch' , 'HistogramFacet' , 'TermsFacet' , 'DateHistogramFacet' ]
12
12
13
13
class Facet (object ):
14
+ """
15
+ A facet on faceted search. Wraps and aggregation and provides functionality
16
+ to create a filter for selected values and return a list of facet values
17
+ from the result of the aggregation.
18
+ """
14
19
agg_type = None
20
+
15
21
def __init__ (self , ** kwargs ):
16
22
self .filter_values = ()
17
23
self ._params = kwargs
18
24
19
25
def get_aggregation (self ):
26
+ """
27
+ Return the aggregation object.
28
+ """
20
29
return A (self .agg_type , ** self ._params )
21
30
22
31
def add_filter (self , filter_values ):
32
+ """
33
+ Construct a filter and remember the values for use in get_values.
34
+ """
23
35
self .filter_values = filter_values
24
36
25
37
if not filter_values :
@@ -31,22 +43,36 @@ def add_filter(self, filter_values):
31
43
return f
32
44
33
45
def get_value_filter (self , filter_value ):
46
+ """
47
+ Construct a filter for an individual value
48
+ """
34
49
pass
35
50
36
- def is_filtered (self , key , bucket ):
51
+ def is_filtered (self , key ):
52
+ """
53
+ Is a filter active on the given key.
54
+ """
37
55
return key in self .filter_values
38
56
39
57
def get_value (self , bucket ):
58
+ """
59
+ return a value representing a bucket. Its key as default.
60
+ """
40
61
return bucket ['key' ]
41
62
42
63
def get_values (self , data ):
64
+ """
65
+ Turn the raw bucket data into a list of tuples containing the key,
66
+ number of documents and a flag indicating whether this value has been
67
+ selected or not.
68
+ """
43
69
out = []
44
70
for bucket in data :
45
71
key = self .get_value (bucket )
46
72
out .append ((
47
73
key ,
48
74
bucket ['doc_count' ],
49
- self .is_filtered (key , self . filter_values )
75
+ self .is_filtered (key )
50
76
))
51
77
return out
52
78
@@ -55,6 +81,8 @@ class TermsFacet(Facet):
55
81
agg_type = 'terms'
56
82
57
83
def add_filter (self , filter_values ):
84
+ """ Create a terms filter instead of bool containing term filters. """
85
+
58
86
self .filter_values = filter_values
59
87
60
88
if filter_values :
@@ -126,19 +154,26 @@ def __init__(self, query=None, filters={}):
126
154
self .add_filter (name , value )
127
155
128
156
def add_filter (self , name , filter_values ):
157
+ """
158
+ Add a filter for a facet.
159
+ """
160
+ # normalize the value into a list
129
161
if not isinstance (filter_values , (tuple , list )):
130
162
if filter_values in (None , '' ):
131
163
return
132
164
filter_values = [filter_values , ]
133
165
134
-
166
+ # get the filter from the facet
135
167
f = self .facets [name ].add_filter (filter_values )
136
168
if f is None :
137
169
return
138
170
139
171
self ._filters [name ] = f
140
172
141
173
def search (self ):
174
+ """
175
+ Construct the Search object.
176
+ """
142
177
return Search (doc_type = self .doc_types , index = self .index )
143
178
144
179
def query (self , search , query ):
0 commit comments