1syntax = "proto2";
2option go_package = "search";
3
4package search;
5
6message Scope {
7  enum Type {
8    USER_BY_CANONICAL_ID = 1;
9    USER_BY_EMAIL = 2;
10    GROUP_BY_CANONICAL_ID = 3;
11    GROUP_BY_EMAIL = 4;
12    GROUP_BY_DOMAIN = 5;
13    ALL_USERS = 6;
14    ALL_AUTHENTICATED_USERS = 7;
15  }
16
17  optional Type type = 1;
18  optional string value = 2;
19}
20
21message Entry {
22  enum Permission {
23    READ = 1;
24    WRITE = 2;
25    FULL_CONTROL = 3;
26  }
27
28  optional Scope scope = 1;
29  optional Permission permission = 2;
30  optional string display_name = 3;
31}
32
33message AccessControlList {
34  optional string owner = 1;
35  repeated Entry entries = 2;
36}
37
38message FieldValue {
39  enum ContentType {
40    TEXT = 0;
41    HTML = 1;
42    ATOM = 2;
43    DATE = 3;
44    NUMBER = 4;
45    GEO = 5;
46  }
47
48  optional ContentType type = 1 [default = TEXT];
49
50  optional string language = 2 [default = "en"];
51
52  optional string string_value = 3;
53
54  optional group Geo = 4 {
55    required double lat = 5;
56    required double lng = 6;
57  }
58}
59
60message Field {
61  required string name = 1;
62  required FieldValue value = 2;
63}
64
65message FieldTypes {
66  required string name = 1;
67  repeated FieldValue.ContentType type = 2;
68}
69
70message IndexShardSettings {
71  repeated int32 prev_num_shards = 1;
72  required int32 num_shards = 2 [default=1];
73  repeated int32 prev_num_shards_search_false = 3;
74  optional string local_replica = 4 [default = ""];
75}
76
77message FacetValue {
78  enum ContentType {
79    ATOM = 2;
80    NUMBER = 4;
81  }
82
83  optional ContentType type = 1 [default = ATOM];
84  optional string string_value = 3;
85}
86
87message Facet {
88  required string name = 1;
89  required FacetValue value = 2;
90}
91
92message DocumentMetadata  {
93  optional int64 version = 1;
94  optional int64 committed_st_version = 2;
95}
96
97message Document {
98  optional string id = 1;
99  optional string language = 2 [default = "en"];
100  repeated Field field = 3;
101  optional int32 order_id = 4;
102  optional OrderIdSource order_id_source = 6 [default = SUPPLIED];
103
104  enum OrderIdSource {
105    DEFAULTED = 0;
106    SUPPLIED = 1;
107  }
108
109  enum Storage {
110    DISK = 0;
111  }
112
113  optional Storage storage = 5 [default = DISK];
114  repeated Facet facet = 8;
115}
116
117message SearchServiceError {
118  enum ErrorCode {
119    OK = 0;
120    INVALID_REQUEST = 1;
121    TRANSIENT_ERROR = 2;
122    INTERNAL_ERROR = 3;
123    PERMISSION_DENIED = 4;
124    TIMEOUT = 5;
125    CONCURRENT_TRANSACTION = 6;
126  }
127}
128
129message RequestStatus {
130  required SearchServiceError.ErrorCode code = 1;
131  optional string error_detail = 2;
132  optional int32 canonical_code = 3;
133}
134
135message IndexSpec {
136  required string name = 1;
137
138  enum Consistency {
139    GLOBAL = 0;
140    PER_DOCUMENT = 1;
141  }
142  optional Consistency consistency = 2 [default = PER_DOCUMENT];
143
144  optional string namespace = 3;
145  optional int32 version = 4;
146
147  enum Source {
148    SEARCH = 0;
149    DATASTORE = 1;
150    CLOUD_STORAGE = 2;
151  }
152  optional Source source = 5 [default = SEARCH];
153
154  enum Mode {
155    PRIORITY = 0;
156    BACKGROUND = 1;
157  }
158  optional Mode mode = 6 [default = PRIORITY];
159}
160
161message IndexMetadata {
162  required IndexSpec index_spec = 1;
163
164  repeated FieldTypes field = 2;
165
166  message Storage {
167    optional int64 amount_used = 1;
168    optional int64 limit = 2;
169  }
170  optional Storage storage = 3;
171}
172
173message IndexDocumentParams {
174  repeated Document document = 1;
175
176  enum Freshness {
177    SYNCHRONOUSLY = 0;
178    WHEN_CONVENIENT = 1;
179  }
180  optional Freshness freshness = 2 [default = SYNCHRONOUSLY, deprecated=true];
181
182  required IndexSpec index_spec = 3;
183}
184
185message IndexDocumentRequest {
186  required IndexDocumentParams params = 1;
187
188  optional bytes app_id = 3;
189}
190
191message IndexDocumentResponse {
192  repeated RequestStatus status = 1;
193
194  repeated string doc_id = 2;
195}
196
197message DeleteDocumentParams {
198  repeated string doc_id = 1;
199
200  required IndexSpec index_spec = 2;
201}
202
203message DeleteDocumentRequest {
204  required DeleteDocumentParams params = 1;
205
206  optional bytes app_id = 3;
207}
208
209message DeleteDocumentResponse {
210  repeated RequestStatus status = 1;
211}
212
213message ListDocumentsParams {
214  required IndexSpec index_spec = 1;
215  optional string start_doc_id = 2;
216  optional bool include_start_doc = 3 [default = true];
217  optional int32 limit = 4 [default = 100];
218  optional bool keys_only = 5;
219}
220
221message ListDocumentsRequest {
222  required ListDocumentsParams params = 1;
223
224  optional bytes app_id = 2;
225}
226
227message ListDocumentsResponse {
228  required RequestStatus status = 1;
229
230  repeated Document document = 2;
231}
232
233message ListIndexesParams {
234  optional bool fetch_schema = 1;
235  optional int32 limit = 2 [default = 20];
236  optional string namespace = 3;
237  optional string start_index_name = 4;
238  optional bool include_start_index = 5 [default = true];
239  optional string index_name_prefix = 6;
240  optional int32 offset = 7;
241  optional IndexSpec.Source source = 8 [default = SEARCH];
242}
243
244message ListIndexesRequest {
245  required ListIndexesParams params = 1;
246
247  optional bytes app_id = 3;
248}
249
250message ListIndexesResponse {
251  required RequestStatus status = 1;
252  repeated IndexMetadata index_metadata = 2;
253}
254
255message DeleteSchemaParams {
256  optional IndexSpec.Source source = 1 [default = SEARCH];
257  repeated IndexSpec index_spec = 2;
258}
259
260message DeleteSchemaRequest {
261  required DeleteSchemaParams params = 1;
262
263  optional bytes app_id = 3;
264}
265
266message DeleteSchemaResponse {
267  repeated RequestStatus status = 1;
268}
269
270message SortSpec {
271  required string sort_expression = 1;
272  optional bool sort_descending = 2 [default = true];
273  optional string default_value_text = 4;
274  optional double default_value_numeric = 5;
275}
276
277message ScorerSpec {
278  enum Scorer {
279    RESCORING_MATCH_SCORER = 0;
280    MATCH_SCORER = 2;
281  }
282  optional Scorer scorer = 1 [default = MATCH_SCORER];
283
284  optional int32 limit = 2 [default = 1000];
285  optional string match_scorer_parameters = 9;
286}
287
288message FieldSpec {
289  repeated string name = 1;
290
291  repeated group Expression = 2 {
292    required string name = 3;
293    required string expression = 4;
294  }
295}
296
297message FacetRange {
298  optional string name = 1;
299  optional string start = 2;
300  optional string end = 3;
301}
302
303message FacetRequestParam {
304  optional int32 value_limit = 1;
305  repeated FacetRange range = 2;
306  repeated string value_constraint = 3;
307}
308
309message FacetAutoDetectParam {
310  optional int32 value_limit = 1 [default = 10];
311}
312
313message FacetRequest {
314  required string name = 1;
315  optional FacetRequestParam params = 2;
316}
317
318message FacetRefinement {
319  required string name = 1;
320  optional string value = 2;
321
322  message Range {
323    optional string start = 1;
324    optional string end = 2;
325  }
326  optional Range range = 3;
327}
328
329message SearchParams {
330  required IndexSpec index_spec = 1;
331  required string query = 2;
332  optional string cursor = 4;
333  optional int32 offset = 11;
334
335  enum CursorType {
336    NONE = 0;
337    SINGLE = 1;
338    PER_RESULT = 2;
339  }
340  optional CursorType cursor_type = 5 [default = NONE];
341
342  optional int32 limit = 6 [default = 20];
343  optional int32 matched_count_accuracy = 7;
344  repeated SortSpec sort_spec = 8;
345  optional ScorerSpec scorer_spec = 9;
346  optional FieldSpec field_spec = 10;
347  optional bool keys_only = 12;
348
349  enum ParsingMode {
350    STRICT = 0;
351    RELAXED = 1;
352  }
353  optional ParsingMode parsing_mode = 13 [default = STRICT];
354
355  optional int32 auto_discover_facet_count = 15 [default = 0];
356  repeated FacetRequest include_facet = 16;
357  repeated FacetRefinement facet_refinement = 17;
358  optional FacetAutoDetectParam facet_auto_detect_param = 18;
359  optional int32 facet_depth = 19 [default=1000];
360}
361
362message SearchRequest {
363  required SearchParams params = 1;
364
365  optional bytes app_id = 3;
366}
367
368message FacetResultValue {
369  required string name = 1;
370  required int32 count = 2;
371  required FacetRefinement refinement = 3;
372}
373
374message FacetResult {
375  required string name = 1;
376  repeated FacetResultValue value = 2;
377}
378
379message SearchResult {
380  required Document document = 1;
381  repeated Field expression = 4;
382  repeated double score = 2;
383  optional string cursor = 3;
384}
385
386message SearchResponse {
387  repeated SearchResult result = 1;
388  required int64 matched_count = 2;
389  required RequestStatus status = 3;
390  optional string cursor = 4;
391  repeated FacetResult facet_result = 5;
392
393  extensions 1000 to 9999;
394}
395