Select Git revision
opensearch_types.go
-
Jan Semmelink authoredJan Semmelink authored
opensearch_types.go 5.37 KiB
package search
import "time"
//Mapping configures an index in OpenSearch
type Index struct {
Settings Settings `json:"settings"`
Mappings Mappings `json:"mappings"`
}
type Settings struct {
Index *SettingsIndex `json:"index,omitempty"`
}
type SettingsIndex struct {
NumberOfShards int `json:"number_of_shards,omitempty"`
NumberOfReplicas int `json:"number_of_replicas,omitempty"`
}
type Mappings struct {
Properties map[string]MappingProperty `json:"properties,omitempty"`
}
type MappingProperty struct {
Type string `json:"type"`
Enabled bool `json:"enabled,omitempty"`
Fields map[string]MappingFieldProperties `json:"fields,omitempty"`
Properties map[string]MappingProperty `json:"properties,omitempty"`
}
type MappingFieldProperties struct {
Keyword *MappingKeyword `json:"keyword"`
}
type MappingKeyword struct {
Type string `json:"type"` //="keyword"
IgnoreAbove int `json:"ignore_above"` //e.g. 256
}
type SearchRequestBody struct {
Size int64 `json:"size,omitempty"`
Query Query `json:"query"`
}
type Query struct {
//one of:
Match *QueryNameValue `json:"match,omitempty" doc:"<field>:<value>"`
Term *QueryNameValue `json:"term,omitempty"`
Range *QueryRange `json:"range,omitempty"`
MultiMatch *QueryMultiMatch `json:"multi_match,omitempty"`
Bool *QueryBool `json:"bool,omitempty"`
}
type QueryMultiMatch struct {
Query string `json:"query" doc:"Text search in below fields"`
Fields []string `json:"fields" doc:"List of fields"`
}
//https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
type QueryBool struct {
Must []Query `json:"must,omitempty" docs:"List of things that must appear in matching documents and will contribute to the score."`
Filter []Query `json:"filter,omitempty" doc:"List of things that must appear in matching documents. However unlike must the score of the query will be ignored. Filter clauses are executed in filter context, meaning that scoring is ignored and clauses are considered for caching."`
Should []Query `json:"should,omitempty" doc:"List of things that should appear in the matching document."`
MustNot []Query `json:"must_not,omitempty" doc:"List of things that must not appear in the matching documents. Clauses are executed in filter context meaning that scoring is ignored and clauses are considered for caching. Because scoring is ignored, a score of 0 for all documents is returned."`
}
//<name>:<value> can be shorthanded to just a text value "...", but for sake of go type def, we always use an object meaning the same, allowing more options
//https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html#query-dsl-match-query-short-ex
type QueryNameValue map[string]QueryValue
type QueryValue struct {
Query string `json:"query"`
Operator string `json:"operator,omitempty"` //defaults to "or", accepted values: or|and
Fuzziness string `json:"fuzziness,omitempty"` //https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#fuzziness
ZeroTermsQuery string `json:"zero_terms_query,omitempty"`
}
func QueryValueText(text string) QueryValue {
return QueryValue{Query: text, Operator: "and"}
}
func QueryValueTime(t time.Time) QueryValue {
return QueryValue{Query: t.String(), Operator: "and"}
}
type QueryRange map[string]QueryExpr
type QueryExpr map[string]QueryValue //<oper>:<value> e.g. "gte":"10"
//example of search response body:
// {
// "took":872,
// "timed_out":false,
// "_shards":{
// "total":38,
// "successful":38,
// "skipped":0,
// "failed":0
// },
// "hits":{
// "total":{
// "value":0,
// "relation":"eq"
// },
// "max_score":null,
// "hits":[
// {
// "_index": "go-utils-audit-test-20211030",
// "_type": "_doc",
// "_id": "Tj9l5XwBWRiAneoYazic",
// "_score": 1.2039728,
// "_source": {
// "@timestamp": "2021-10-30T15:03:20.679481+02:00",
// "@end_time": "2021-10-30T15:03:20.469481+02:00",
// "@duration_ms": -210,
// "test1": "6",
// "test2": "ACC_00098",
// "test3": 10,
// "http": {
// "method": "GET",
// "path": "/accounts"
// },
// "http_method": "GET",
// "http_path": "/accounts"
// }
// },
// ]
// }
// }
type SearchResponseBody struct {
Took int `json:"took"` //milliseconds
TimedOut bool `json:"timed_out"`
Shards SearchResponseShards `json:"_shards"`
Hits SearchResponseHits `json:"hits"`
}
type SearchResponseShards struct {
Total int `json:"total"`
Successful int `json:"successful"`
Skipped int `json:"skipped"`
Failed int `json:"failed"`
}
type SearchResponseHits struct {
Total SearchResponseHitsTotal `json:"total"`
MaxScore *float64 `json:"max_score,omitempty"`
Hits []HitDoc `json:"hits"`
}
type SearchResponseHitsTotal struct {
Value int `json:"value"` //e.g. 0 when no docs matched
Relation string `json:"relation"` //e.g. "eq"
}
type HitDoc struct {
Index string `json:"_index"` //name of index
Type string `json:"_type"` //_doc
ID string `json:"_id"`
Score float64 `json:"_score"` //
Source map[string]interface{} `json:"_source"` //the document of itemType
}