search

package
v0.0.0-...-d725210 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2019 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var HighTerm = strings.Repeat(string([]byte{0xff}), 10)
View Source
var LowTerm = string([]byte{0x00})

Functions

func LevenshteinDistance

func LevenshteinDistance(a, b string) int

func LevenshteinDistanceMax

func LevenshteinDistanceMax(a, b string, max int) (int, bool)

LevenshteinDistanceMax same as LevenshteinDistance but attempts to bail early once we know the distance will be greater than max in which case the first return val will be the max and the second will be true, indicating max was exceeded

func LevenshteinDistanceMaxReuseSlice

func LevenshteinDistanceMaxReuseSlice(a, b string, max int, d []int) (int, bool, []int)

Types

type ArrayPositions

type ArrayPositions []uint64

func (ArrayPositions) Equals

func (ap ArrayPositions) Equals(other ArrayPositions) bool

type BytesSlice

type BytesSlice [][]byte

func (BytesSlice) Len

func (p BytesSlice) Len() int

func (BytesSlice) Less

func (p BytesSlice) Less(i, j int) bool

func (BytesSlice) Swap

func (p BytesSlice) Swap(i, j int)

type Collector

type Collector interface {
	Collect(ctx context.Context, searcher Searcher, reader index.IndexReader) error
	Results() DocumentMatchCollection
	Total() uint64
	MaxScore() float64
	Took() time.Duration
	SetFacetsBuilder(facetsBuilder *FacetsBuilder)
	FacetResults() FacetResults
}

type DateRangeFacet

type DateRangeFacet struct {
	Name  string  `json:"name"`
	Start *string `json:"start,omitempty"`
	End   *string `json:"end,omitempty"`
	Count int     `json:"count"`
}

func (*DateRangeFacet) Same

func (drf *DateRangeFacet) Same(other *DateRangeFacet) bool

type DateRangeFacets

type DateRangeFacets []*DateRangeFacet

func (DateRangeFacets) Add

func (drf DateRangeFacets) Add(dateRangeFacet *DateRangeFacet) DateRangeFacets

func (DateRangeFacets) Len

func (drf DateRangeFacets) Len() int

func (DateRangeFacets) Less

func (drf DateRangeFacets) Less(i, j int) bool

func (DateRangeFacets) Swap

func (drf DateRangeFacets) Swap(i, j int)

type DocumentMatch

type DocumentMatch struct {
	Index           string                `json:"index,omitempty"`
	ID              string                `json:"id"`
	IndexInternalID index.IndexInternalID `json:"-"`
	Score           float64               `json:"score"`
	Expl            *Explanation          `json:"explanation,omitempty"`
	Locations       FieldTermLocationMap  `json:"locations,omitempty"`
	Fragments       FieldFragmentMap      `json:"fragments,omitempty"`
	Sort            []string              `json:"sort,omitempty"`

	// Fields contains the values for document fields listed in
	// SearchRequest.Fields. Text fields are returned as strings, numeric
	// fields as float64s and date fields as time.RFC3339 formatted strings.
	Fields map[string]interface{} `json:"fields,omitempty"`

	// if we load the document for this hit, remember it so we dont load again
	Document *document.Document `json:"-"`

	// used to maintain natural index order
	HitNumber uint64 `json:"-"`

	// used to temporarily hold field term location information during
	// search processing in an efficient, recycle-friendly manner, to
	// be later incorporated into the Locations map when search
	// results are completed
	FieldTermLocations []FieldTermLocation `json:"-"`
}

func (*DocumentMatch) AddFieldValue

func (dm *DocumentMatch) AddFieldValue(name string, value interface{})

func (*DocumentMatch) Complete

func (dm *DocumentMatch) Complete(prealloc []Location) []Location

Complete performs final preparation & transformation of the DocumentMatch at the end of search processing, also allowing the caller to provide an optional preallocated locations slice

func (*DocumentMatch) Reset

func (dm *DocumentMatch) Reset() *DocumentMatch

Reset allows an already allocated DocumentMatch to be reused

func (*DocumentMatch) Size

func (dm *DocumentMatch) Size() int

func (*DocumentMatch) String

func (dm *DocumentMatch) String() string

type DocumentMatchCollection

type DocumentMatchCollection []*DocumentMatch

func (DocumentMatchCollection) Len

func (c DocumentMatchCollection) Len() int

func (DocumentMatchCollection) Less

func (c DocumentMatchCollection) Less(i, j int) bool

func (DocumentMatchCollection) Swap

func (c DocumentMatchCollection) Swap(i, j int)

type DocumentMatchPool

type DocumentMatchPool struct {
	TooSmall DocumentMatchPoolTooSmall
	// contains filtered or unexported fields
}

DocumentMatchPool manages use/re-use of DocumentMatch instances it pre-allocates space from a single large block with the expected number of instances. It is not thread-safe as currently all aspects of search take place in a single goroutine.

func NewDocumentMatchPool

func NewDocumentMatchPool(size, sortsize int) *DocumentMatchPool

NewDocumentMatchPool will build a DocumentMatchPool with memory pre-allocated to accommodate the requested number of DocumentMatch instances

func (*DocumentMatchPool) Get

func (p *DocumentMatchPool) Get() *DocumentMatch

Get returns an available DocumentMatch from the pool if the pool was not allocated with sufficient size, an allocation will occur to satisfy this request. As a side-effect this will grow the size of the pool.

func (*DocumentMatchPool) Put

func (p *DocumentMatchPool) Put(d *DocumentMatch)

Put returns a DocumentMatch to the pool

type DocumentMatchPoolTooSmall

type DocumentMatchPoolTooSmall func(p *DocumentMatchPool) *DocumentMatch

DocumentMatchPoolTooSmall is a callback function that can be executed when the DocumentMatchPool does not have sufficient capacity By default we just perform just-in-time allocation, but you could log a message, or panic, etc.

type Explanation

type Explanation struct {
	Value    float64        `json:"value"`
	Message  string         `json:"message"`
	Children []*Explanation `json:"children,omitempty"`
}

func (*Explanation) Size

func (expl *Explanation) Size() int

func (*Explanation) String

func (expl *Explanation) String() string

type FacetBuilder

type FacetBuilder interface {
	StartDoc()
	UpdateVisitor(field string, term []byte)
	EndDoc()

	Result() *FacetResult
	Field() string

	Size() int
}

type FacetResult

type FacetResult struct {
	Field         string             `json:"field"`
	Total         int                `json:"total"`
	Missing       int                `json:"missing"`
	Other         int                `json:"other"`
	Terms         TermFacets         `json:"terms,omitempty"`
	NumericRanges NumericRangeFacets `json:"numeric_ranges,omitempty"`
	DateRanges    DateRangeFacets    `json:"date_ranges,omitempty"`
}

func (*FacetResult) Fixup

func (fr *FacetResult) Fixup(size int)

func (*FacetResult) Merge

func (fr *FacetResult) Merge(other *FacetResult)

func (*FacetResult) Size

func (fr *FacetResult) Size() int

type FacetResults

type FacetResults map[string]*FacetResult

func (FacetResults) Fixup

func (fr FacetResults) Fixup(name string, size int)

func (FacetResults) Merge

func (fr FacetResults) Merge(other FacetResults)

type FacetsBuilder

type FacetsBuilder struct {
	// contains filtered or unexported fields
}

func NewFacetsBuilder

func NewFacetsBuilder(indexReader index.IndexReader) *FacetsBuilder

func (*FacetsBuilder) Add

func (fb *FacetsBuilder) Add(name string, facetBuilder FacetBuilder)

func (*FacetsBuilder) EndDoc

func (fb *FacetsBuilder) EndDoc()

func (*FacetsBuilder) RequiredFields

func (fb *FacetsBuilder) RequiredFields() []string

func (*FacetsBuilder) Results

func (fb *FacetsBuilder) Results() FacetResults

func (*FacetsBuilder) Size

func (fb *FacetsBuilder) Size() int

func (*FacetsBuilder) StartDoc

func (fb *FacetsBuilder) StartDoc()

func (*FacetsBuilder) UpdateVisitor

func (fb *FacetsBuilder) UpdateVisitor(field string, term []byte)

type FieldFragmentMap

type FieldFragmentMap map[string][]string

type FieldTermLocation

type FieldTermLocation struct {
	Field    string
	Term     string
	Location Location
}

func MergeFieldTermLocations

func MergeFieldTermLocations(dest []FieldTermLocation, matches []*DocumentMatch) []FieldTermLocation

type FieldTermLocationMap

type FieldTermLocationMap map[string]TermLocationMap

func MergeLocations

func MergeLocations(locations []FieldTermLocationMap) FieldTermLocationMap

type Location

type Location struct {
	// Pos is the position of the term within the field, starting at 1
	Pos uint64 `json:"pos"`

	// Start and End are the byte offsets of the term in the field
	Start uint64 `json:"start"`
	End   uint64 `json:"end"`

	// ArrayPositions contains the positions of the term within any elements.
	ArrayPositions ArrayPositions `json:"array_positions"`
}

func (*Location) Size

func (l *Location) Size() int

type Locations

type Locations []*Location

type NumericRangeFacet

type NumericRangeFacet struct {
	Name  string   `json:"name"`
	Min   *float64 `json:"min,omitempty"`
	Max   *float64 `json:"max,omitempty"`
	Count int      `json:"count"`
}

func (*NumericRangeFacet) Same

func (nrf *NumericRangeFacet) Same(other *NumericRangeFacet) bool

type NumericRangeFacets

type NumericRangeFacets []*NumericRangeFacet

func (NumericRangeFacets) Add

func (nrf NumericRangeFacets) Add(numericRangeFacet *NumericRangeFacet) NumericRangeFacets

func (NumericRangeFacets) Len

func (nrf NumericRangeFacets) Len() int

func (NumericRangeFacets) Less

func (nrf NumericRangeFacets) Less(i, j int) bool

func (NumericRangeFacets) Swap

func (nrf NumericRangeFacets) Swap(i, j int)

type SearchContext

type SearchContext struct {
	DocumentMatchPool *DocumentMatchPool
}

SearchContext represents the context around a single search

func (*SearchContext) Size

func (sc *SearchContext) Size() int

type SearchSort

type SearchSort interface {
	UpdateVisitor(field string, term []byte)
	Value(a *DocumentMatch) string
	Descending() bool

	RequiresDocID() bool
	RequiresScoring() bool
	RequiresFields() []string

	Copy() SearchSort
}

func ParseSearchSortJSON

func ParseSearchSortJSON(input json.RawMessage) (SearchSort, error)

func ParseSearchSortObj

func ParseSearchSortObj(input map[string]interface{}) (SearchSort, error)

func ParseSearchSortString

func ParseSearchSortString(input string) SearchSort

type Searcher

type Searcher interface {
	Next(ctx *SearchContext) (*DocumentMatch, error)
	Advance(ctx *SearchContext, ID index.IndexInternalID) (*DocumentMatch, error)
	Close() error
	Weight() float64
	SetQueryNorm(float64)
	Count() uint64
	Min() int
	Size() int

	DocumentMatchPoolSize() int
}

type SearcherOptions

type SearcherOptions struct {
	Explain            bool
	IncludeTermVectors bool
}

type SortDocID

type SortDocID struct {
	Desc bool
}

SortDocID will sort results by the document identifier

func (*SortDocID) Copy

func (s *SortDocID) Copy() SearchSort

func (*SortDocID) Descending

func (s *SortDocID) Descending() bool

Descending determines the order of the sort

func (*SortDocID) MarshalJSON

func (s *SortDocID) MarshalJSON() ([]byte, error)

func (*SortDocID) RequiresDocID

func (s *SortDocID) RequiresDocID() bool

RequiresDocID says this SearchSort does require the DocID be loaded

func (*SortDocID) RequiresFields

func (s *SortDocID) RequiresFields() []string

RequiresFields says this SearchStore does not require any stored fields

func (*SortDocID) RequiresScoring

func (s *SortDocID) RequiresScoring() bool

RequiresScoring says this SearchStore does not require scoring

func (*SortDocID) UpdateVisitor

func (s *SortDocID) UpdateVisitor(field string, term []byte)

UpdateVisitor is a no-op for SortDocID as it's value is not dependent on any field terms

func (*SortDocID) Value

func (s *SortDocID) Value(i *DocumentMatch) string

Value returns the sort value of the DocumentMatch

type SortField

type SortField struct {
	Field   string
	Desc    bool
	Type    SortFieldType
	Mode    SortFieldMode
	Missing SortFieldMissing
	// contains filtered or unexported fields
}

SortField will sort results by the value of a stored field

Field is the name of the field
Descending reverse the sort order (default false)
Type allows forcing of string/number/date behavior (default auto)
Mode controls behavior for multi-values fields (default first)
Missing controls behavior of missing values (default last)

func (*SortField) Copy

func (s *SortField) Copy() SearchSort

func (*SortField) Descending

func (s *SortField) Descending() bool

Descending determines the order of the sort

func (*SortField) MarshalJSON

func (s *SortField) MarshalJSON() ([]byte, error)

func (*SortField) RequiresDocID

func (s *SortField) RequiresDocID() bool

RequiresDocID says this SearchSort does not require the DocID be loaded

func (*SortField) RequiresFields

func (s *SortField) RequiresFields() []string

RequiresFields says this SearchStore requires the specified stored field

func (*SortField) RequiresScoring

func (s *SortField) RequiresScoring() bool

RequiresScoring says this SearchStore does not require scoring

func (*SortField) UpdateVisitor

func (s *SortField) UpdateVisitor(field string, term []byte)

UpdateVisitor notifies this sort field that in this document this field has the specified term

func (*SortField) Value

func (s *SortField) Value(i *DocumentMatch) string

Value returns the sort value of the DocumentMatch it also resets the state of this SortField for processing the next document

type SortFieldMissing

type SortFieldMissing int

SortFieldMissing controls where documents missing a field value should be sorted

const (
	// SortFieldMissingLast sorts documents missing a field at the end
	SortFieldMissingLast SortFieldMissing = iota

	// SortFieldMissingFirst sorts documents missing a field at the beginning
	SortFieldMissingFirst
)

type SortFieldMode

type SortFieldMode int

SortFieldMode describes the behavior if the field has multiple values

const (
	// SortFieldDefault uses the first (or only) value, this is the default zero-value
	SortFieldDefault SortFieldMode = iota // FIXME name is confusing
	// SortFieldMin uses the minimum value
	SortFieldMin
	// SortFieldMax uses the maximum value
	SortFieldMax
)

type SortFieldType

type SortFieldType int

SortFieldType lets you control some internal sort behavior normally leaving this to the zero-value of SortFieldAuto is fine

const (
	// SortFieldAuto applies heuristics attempt to automatically sort correctly
	SortFieldAuto SortFieldType = iota
	// SortFieldAsString forces sort as string (no prefix coded terms removed)
	SortFieldAsString
	// SortFieldAsNumber forces sort as string (prefix coded terms with shift > 0 removed)
	SortFieldAsNumber
	// SortFieldAsDate forces sort as string (prefix coded terms with shift > 0 removed)
	SortFieldAsDate
)

type SortGeoDistance

type SortGeoDistance struct {
	Field string
	Desc  bool
	Unit  string

	Lon float64
	Lat float64
	// contains filtered or unexported fields
}

SortGeoDistance will sort results by the distance of an indexed geo point, from the provided location.

Field is the name of the field
Descending reverse the sort order (default false)

func NewSortGeoDistance

func NewSortGeoDistance(field, unit string, lon, lat float64, desc bool) (
	*SortGeoDistance, error)

NewSortGeoDistance creates SearchSort instance for sorting documents by their distance from the specified point.

func (*SortGeoDistance) Copy

func (s *SortGeoDistance) Copy() SearchSort

func (*SortGeoDistance) Descending

func (s *SortGeoDistance) Descending() bool

Descending determines the order of the sort

func (*SortGeoDistance) MarshalJSON

func (s *SortGeoDistance) MarshalJSON() ([]byte, error)

func (*SortGeoDistance) RequiresDocID

func (s *SortGeoDistance) RequiresDocID() bool

RequiresDocID says this SearchSort does not require the DocID be loaded

func (*SortGeoDistance) RequiresFields

func (s *SortGeoDistance) RequiresFields() []string

RequiresFields says this SearchStore requires the specified stored field

func (*SortGeoDistance) RequiresScoring

func (s *SortGeoDistance) RequiresScoring() bool

RequiresScoring says this SearchStore does not require scoring

func (*SortGeoDistance) UpdateVisitor

func (s *SortGeoDistance) UpdateVisitor(field string, term []byte)

UpdateVisitor notifies this sort field that in this document this field has the specified term

func (*SortGeoDistance) Value

func (s *SortGeoDistance) Value(i *DocumentMatch) string

Value returns the sort value of the DocumentMatch it also resets the state of this SortField for processing the next document

type SortOrder

type SortOrder []SearchSort

func ParseSortOrderJSON

func ParseSortOrderJSON(in []json.RawMessage) (SortOrder, error)

func ParseSortOrderStrings

func ParseSortOrderStrings(in []string) SortOrder

func (SortOrder) CacheDescending

func (so SortOrder) CacheDescending() []bool

func (SortOrder) CacheIsScore

func (so SortOrder) CacheIsScore() []bool

func (SortOrder) Compare

func (so SortOrder) Compare(cachedScoring, cachedDesc []bool, i, j *DocumentMatch) int

Compare will compare two document matches using the specified sort order if both are numbers, we avoid converting back to term

func (SortOrder) Copy

func (so SortOrder) Copy() SortOrder

func (SortOrder) RequiredFields

func (so SortOrder) RequiredFields() []string

func (SortOrder) RequiresDocID

func (so SortOrder) RequiresDocID() bool

func (SortOrder) RequiresScore

func (so SortOrder) RequiresScore() bool

func (SortOrder) UpdateVisitor

func (so SortOrder) UpdateVisitor(field string, term []byte)

func (SortOrder) Value

func (so SortOrder) Value(doc *DocumentMatch)

type SortScore

type SortScore struct {
	Desc bool
}

SortScore will sort results by the document match score

func (*SortScore) Copy

func (s *SortScore) Copy() SearchSort

func (*SortScore) Descending

func (s *SortScore) Descending() bool

Descending determines the order of the sort

func (*SortScore) MarshalJSON

func (s *SortScore) MarshalJSON() ([]byte, error)

func (*SortScore) RequiresDocID

func (s *SortScore) RequiresDocID() bool

RequiresDocID says this SearchSort does not require the DocID be loaded

func (*SortScore) RequiresFields

func (s *SortScore) RequiresFields() []string

RequiresFields says this SearchStore does not require any store fields

func (*SortScore) RequiresScoring

func (s *SortScore) RequiresScoring() bool

RequiresScoring says this SearchStore does require scoring

func (*SortScore) UpdateVisitor

func (s *SortScore) UpdateVisitor(field string, term []byte)

UpdateVisitor is a no-op for SortScore as it's value is not dependent on any field terms

func (*SortScore) Value

func (s *SortScore) Value(i *DocumentMatch) string

Value returns the sort value of the DocumentMatch

type TermFacet

type TermFacet struct {
	Term  string `json:"term"`
	Count int    `json:"count"`
}

type TermFacets

type TermFacets []*TermFacet

func (TermFacets) Add

func (tf TermFacets) Add(termFacet *TermFacet) TermFacets

func (TermFacets) Len

func (tf TermFacets) Len() int

func (TermFacets) Less

func (tf TermFacets) Less(i, j int) bool

func (TermFacets) Swap

func (tf TermFacets) Swap(i, j int)

type TermLocationMap

type TermLocationMap map[string]Locations

func MergeTermLocationMaps

func MergeTermLocationMaps(rv, other TermLocationMap) TermLocationMap

func (TermLocationMap) AddLocation

func (t TermLocationMap) AddLocation(term string, location *Location)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL