modern text indexing in go - blugelabs.com
Features
- Supported field types:
- Text, Numeric, Date, Geo Point
- Supported query types:
- Term, Phrase, Match, Match Phrase, Prefix
- Conjunction, Disjunction, Boolean
- Numeric Range, Date Range
- BM25 Similarity/Scoring with pluggable interfaces
- Search result match highlighting
- Extendable Aggregations:
- Bucketing
- Terms
- Numeric Range
- Date Range
- Metrics
- Min/Max/Count/Sum
- Avg/Weighted Avg
- Cardinality Estimation (HyperLogLog++)
- Quantile Approximation (T-Digest)
- Bucketing
Indexing
config := bluge.DefaultConfig(path) writer, err := bluge.OpenWriter(config) if err != nil { log.Fatalf("error opening writer: %v", err) } defer writer.Close() doc := bluge.NewDocument("example"). AddField(bluge.NewTextField("name", "bluge")) err = writer.Update(doc.ID(), doc) if err != nil { log.Fatalf("error updating document: %v", err) }
Querying
reader, err := writer.Reader() if err != nil { log.Fatalf("error getting index reader: %v", err) } defer reader.Close() query := bluge.NewMatchQuery("bluge").SetField("name") request := bluge.NewTopNSearch(10, query). WithStandardAggregations() documentMatchIterator, err := reader.Search(context.Background(), request) if err != nil { log.Fatalf("error executing search: %v", err) } match, err := documentMatchIterator.Next() for err == nil && match != nil { err = match.VisitStoredFields(func(field string, value []byte) bool { if field == "_id" { fmt.Printf("match: %s\n", string(value)) } return true }) if err != nil { log.Fatalf("error loading stored fields: %v", err) } match, err = documentMatchIterator.Next() } if err != nil { log.Fatalf("error iterator document matches: %v", err) }
License
Apache License Version 2.0