Elasticsearch的一个Google Go客户端:Elastic
jopen
10年前
Elastic是分布式搜索引擎Elasticsearch的一个Google Go客户端。Elastic 在生产环境中测试支持的Elasticsearch版本: 0.90, 1.0, 1.1, 1.2, 和 1.3。
// Import Elastic import ( "github.com/olivere/elastic" ) // Obtain a client. You can provide your own HTTP client here. client, err := elastic.NewClient(http.DefaultClient) if err != nil { // Handle error panic(err) } // Use the IndexExists service to check if a specified index exists. exists, err := client.IndexExists("推ter").Do() if err != nil { // Handle error panic(err) } if !exists { // Create a new index. createIndex, err := client.CreateIndex("推ter").Do() if err != nil { // Handle error panic(err) } if !createIndex.Acknowledged { // Not acknowledged } } // Index a tweet (using JSON serialization) tweet1 := Tweet{User: "olivere", Message: "Take Five"} put1, err := client.Index(). Index("推ter"). Type("tweet"). Id("1"). BodyJson(tweet1). Do() if err != nil { // Handle error panic(err) } fmt.Printf("Indexed tweet %s to index %s, type %s\n", put1.Id, put1.Index, put1.Type) // Index a second tweet (by string) tweet2 := `{"user" : "olivere", "message" : "It's a Raggy Waltz"}` put2, err := client.Index(). Index("推ter"). Type("tweet"). Id("2"). BodyString(tweet2). Do() if err != nil { // Handle error panic(err) } fmt.Printf("Indexed tweet %s to index %s, type %s\n", put2.Id, put2.Index, put2.Type) // Get tweet with specified ID get1, err := client.Get(). Index("推ter"). Type("tweet"). Id("1"). Do() if err != nil { // Handle error panic(err) } if get1.Found { fmt.Printf("Got document %s in version %d from index %s, type %s\n", get1.Id, get1.Version, get1.Index, get1.Type) } // Flush to make sure the documents got written. _, err = client.Flush().Index("推ter").Do() if err != nil { panic(err) } // Search with a term query termQuery := elastic.NewTermQuery("user", "olivere") searchResult, err := client.Search(). Index("推ter"). // search in index "推ter" Query(&termQuery). // specify the query Sort("user", true). // sort by "user" field, ascending From(0).Size(10). // take documents 0-9 Debug(true). // print request and response to stdout Pretty(true). // pretty print request and response JSON Do() // execute if err != nil { // Handle error panic(err) } // searchResult is of type SearchResult and returns hits, suggestions, // and all kinds of other information from Elasticsearch. fmt.Printf("Query took %d milliseconds\n", searchResult.TookInMillis) // Number of hits if searchResult.Hits != nil { fmt.Printf("Found a total of %d tweets\n", searchResult.Hits.TotalHits) // Iterate through results for _, hit := range searchResult.Hits.Hits { // hit.Index contains the name of the index // Deserialize hit.Source into a Tweet (could also be just a map[string]interface{}). var t Tweet err := json.Unmarshal(*hit.Source, &t) if err != nil { // Deserialization failed } // Work with tweet fmt.Printf("Tweet by %s: %s\n", t.User, t.Message) } } else { // No hits fmt.Print("Found no tweets\n") } // ... // Delete an index. deleteIndex, err := client.DeleteIndex("推ter").Do() if err != nil { // Handle error panic(err) } if !deleteIndex.Acknowledged { // Not acknowledged }
API Status
Here's the current API status.
APIs
- Search (most queries, filters, facets, aggregations etc. are implemented: see below)
- Index
- Get
- Delete
- Update
- Multi Get
- Bulk
- Bulk UDP
- Term vectors
- Multi term vectors
- Count
- Validate
- Explain
- Search
- Search shards
- Search template
- Facets (most are implemented, see below)
- Aggregates (most are implemented, see below)
- Multi Search
- Percolate
- Delete By Query
- More like this
- Benchmark
Indices
- Create index
- Delete index
- Indices exists
- Open/close index
- Put mapping
- Get mapping
- Get field mapping
- Types exist
- Delete mapping
- Index aliases
- Update indices settings
- Get settings
- Analyze
- Index templates
- Warmers
- Status
- Indices stats
- Indices segments
- Indices recovery
- Clear cache
- Flush
- Refresh
- Optimize
Snapshot and Restore
- Snapshot
- Restore
- Snapshot status
- Monitoring snapshot/restore progress
- Partial restore
Cat APIs
Not implemented. Those are better suited for operating with Elasticsearch on the command line.
Cluster
- Health
- State
- Stats
- Pending cluster tasks
- Cluster reroute
- Cluster update settings
- Nodes stats
- Nodes info
- Nodes hot_threads
- Nodes shutdown
Query DSL
Queries
-
match
-
multi_match
-
bool
-
boosting
-
common_terms
-
constant_score
-
dis_max
-
filtered
-
fuzzy_like_this_query
(flt
) -
fuzzy_like_this_field_query
(flt_field
) -
function_score
-
fuzzy
-
geo_shape
-
has_child
-
has_parent
-
ids
-
indices
-
match_all
-
mlt
-
mlt_field
-
nested
-
prefix
-
query_string
-
simple_query_string
-
range
-
regexp
-
span_first
-
span_multi_term
-
span_near
-
span_not
-
span_or
-
span_term
-
term
-
terms
-
top_children
-
wildcard
-
minimum_should_match
-
multi_term_query_rewrite
-
template_query
Filters
-
and
-
bool
-
exists
-
geo_bounding_box
-
geo_distance
-
geo_distance_range
-
geo_polygon
-
geoshape
-
geohash
-
has_child
-
has_parent
-
ids
-
indices
-
limit
-
match_all
-
missing
-
nested
-
not
-
or
-
prefix
-
query
-
range
-
regexp
-
script
-
term
-
terms
-
type
Facets
- Terms
- Range
- Histogram
- Date Histogram
- Filter
- Query
- Statistical
- Terms Stats
- Geo Distance
Aggregations
- min
- max
- sum
- avg
- stats
- extended stats
- value count
- percentiles
- percentile ranks
- cardinality
- geo bounds
- top hits
- scripted metric
- global
- filter
- filters
- missing
- nested
- reverse nested
- children
- terms
- significant terms
- range
- date range
- ipv4 range
- histogram
- date histogram
- geo distance
- geohash grid