185 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2013 Belogik. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package goes
 | 
						|
 | 
						|
import (
 | 
						|
	"net/http"
 | 
						|
	"net/url"
 | 
						|
)
 | 
						|
 | 
						|
// Represents a Connection object to elasticsearch
 | 
						|
type Connection struct {
 | 
						|
	// The host to connect to
 | 
						|
	Host string
 | 
						|
 | 
						|
	// The port to use
 | 
						|
	Port string
 | 
						|
 | 
						|
	// Client is the http client used to make requests, allowing settings things
 | 
						|
	// such as timeouts etc
 | 
						|
	Client *http.Client
 | 
						|
}
 | 
						|
 | 
						|
// Represents a Request to elasticsearch
 | 
						|
type Request struct {
 | 
						|
	// Which connection will be used
 | 
						|
	Conn *Connection
 | 
						|
 | 
						|
	// A search query
 | 
						|
	Query interface{}
 | 
						|
 | 
						|
	// Which index to search into
 | 
						|
	IndexList []string
 | 
						|
 | 
						|
	// Which type to search into
 | 
						|
	TypeList []string
 | 
						|
 | 
						|
	// HTTP Method to user (GET, POST ...)
 | 
						|
	method string
 | 
						|
 | 
						|
	// Which api keyword (_search, _bulk, etc) to use
 | 
						|
	api string
 | 
						|
 | 
						|
	// Bulk data
 | 
						|
	bulkData []byte
 | 
						|
 | 
						|
	// Request body
 | 
						|
	Body []byte
 | 
						|
 | 
						|
	// A list of extra URL arguments
 | 
						|
	ExtraArgs url.Values
 | 
						|
 | 
						|
	// Used for the id field when indexing a document
 | 
						|
	id string
 | 
						|
}
 | 
						|
 | 
						|
// Represents a Response from elasticsearch
 | 
						|
type Response struct {
 | 
						|
	Acknowledged bool
 | 
						|
	Error        string
 | 
						|
	Errors       bool
 | 
						|
	Status       uint64
 | 
						|
	Took         uint64
 | 
						|
	TimedOut     bool  `json:"timed_out"`
 | 
						|
	Shards       Shard `json:"_shards"`
 | 
						|
	Hits         Hits
 | 
						|
	Index        string `json:"_index"`
 | 
						|
	Id           string `json:"_id"`
 | 
						|
	Type         string `json:"_type"`
 | 
						|
	Version      int    `json:"_version"`
 | 
						|
	Found        bool
 | 
						|
	Count        int
 | 
						|
 | 
						|
	// Used by the _stats API
 | 
						|
	All All `json:"_all"`
 | 
						|
 | 
						|
	// Used by the _bulk API
 | 
						|
	Items []map[string]Item `json:"items,omitempty"`
 | 
						|
 | 
						|
	// Used by the GET API
 | 
						|
	Source map[string]interface{} `json:"_source"`
 | 
						|
	Fields map[string]interface{} `json:"fields"`
 | 
						|
 | 
						|
	// Used by the _status API
 | 
						|
	Indices map[string]IndexStatus
 | 
						|
 | 
						|
	// Scroll id for iteration
 | 
						|
	ScrollId string `json:"_scroll_id"`
 | 
						|
 | 
						|
	Aggregations map[string]Aggregation `json:"aggregations,omitempty"`
 | 
						|
 | 
						|
	Raw map[string]interface{}
 | 
						|
}
 | 
						|
 | 
						|
// Represents an aggregation from response
 | 
						|
type Aggregation map[string]interface{}
 | 
						|
 | 
						|
// Represents a bucket for aggregation
 | 
						|
type Bucket map[string]interface{}
 | 
						|
 | 
						|
// Represents a document to send to elasticsearch
 | 
						|
type Document struct {
 | 
						|
	// XXX : interface as we can support nil values
 | 
						|
	Index       interface{}
 | 
						|
	Type        string
 | 
						|
	Id          interface{}
 | 
						|
	BulkCommand string
 | 
						|
	Fields      interface{}
 | 
						|
}
 | 
						|
 | 
						|
// Represents the "items" field in a _bulk response
 | 
						|
type Item struct {
 | 
						|
	Type    string `json:"_type"`
 | 
						|
	Id      string `json:"_id"`
 | 
						|
	Index   string `json:"_index"`
 | 
						|
	Version int    `json:"_version"`
 | 
						|
	Error   string `json:"error"`
 | 
						|
	Status  uint64 `json:"status"`
 | 
						|
}
 | 
						|
 | 
						|
// Represents the "_all" field when calling the _stats API
 | 
						|
// This is minimal but this is what I only need
 | 
						|
type All struct {
 | 
						|
	Indices   map[string]StatIndex   `json:"indices"`
 | 
						|
	Primaries map[string]StatPrimary `json:"primaries"`
 | 
						|
}
 | 
						|
 | 
						|
type StatIndex struct {
 | 
						|
	Primaries map[string]StatPrimary `json:"primaries"`
 | 
						|
}
 | 
						|
 | 
						|
type StatPrimary struct {
 | 
						|
	// primary/docs:
 | 
						|
	Count   int
 | 
						|
	Deleted int
 | 
						|
}
 | 
						|
 | 
						|
// Represents the "shard" struct as returned by elasticsearch
 | 
						|
type Shard struct {
 | 
						|
	Total      uint64
 | 
						|
	Successful uint64
 | 
						|
	Failed     uint64
 | 
						|
}
 | 
						|
 | 
						|
// Represent a hit returned by a search
 | 
						|
type Hit struct {
 | 
						|
	Index     string                 `json:"_index"`
 | 
						|
	Type      string                 `json:"_type"`
 | 
						|
	Id        string                 `json:"_id"`
 | 
						|
	Score     float64                `json:"_score"`
 | 
						|
	Source    map[string]interface{} `json:"_source"`
 | 
						|
	Highlight map[string]interface{} `json:"highlight"`
 | 
						|
	Fields    map[string]interface{} `json:"fields"`
 | 
						|
}
 | 
						|
 | 
						|
// Represent the hits structure as returned by elasticsearch
 | 
						|
type Hits struct {
 | 
						|
	Total uint64
 | 
						|
	// max_score may contain the "null" value
 | 
						|
	MaxScore interface{} `json:"max_score"`
 | 
						|
	Hits     []Hit
 | 
						|
}
 | 
						|
 | 
						|
type SearchError struct {
 | 
						|
	Msg        string
 | 
						|
	StatusCode uint64
 | 
						|
}
 | 
						|
 | 
						|
// Represent the status for a given index for the _status command
 | 
						|
type IndexStatus struct {
 | 
						|
	// XXX : problem, int will be marshaled to a float64 which seems logical
 | 
						|
	// XXX : is it better to use strings even for int values or to keep
 | 
						|
	// XXX : interfaces and deal with float64 ?
 | 
						|
	Index map[string]interface{}
 | 
						|
 | 
						|
	Translog map[string]uint64
 | 
						|
	Docs     map[string]uint64
 | 
						|
	Merges   map[string]interface{}
 | 
						|
	Refresh  map[string]interface{}
 | 
						|
	Flush    map[string]interface{}
 | 
						|
 | 
						|
	// TODO: add shards support later, we do not need it for the moment
 | 
						|
}
 |