diff --git a/index/index.go b/index/index.go index 1515f9a4..dcef48e9 100644 --- a/index/index.go +++ b/index/index.go @@ -77,6 +77,7 @@ type IndexReader interface { Document(id string) (*document.Document, error) DocumentFieldTerms(id string) (FieldTerms, error) + DocumentFieldTermsForFields(id string, fields []string) (FieldTerms, error) Fields() ([]string, error) diff --git a/index/upside_down/index_reader.go b/index/upside_down/index_reader.go index fb43a86e..49655adf 100644 --- a/index/upside_down/index_reader.go +++ b/index/upside_down/index_reader.go @@ -10,6 +10,8 @@ package upside_down import ( + "fmt" + "github.com/blevesearch/bleve/document" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/index/store" @@ -110,6 +112,33 @@ func (i *IndexReader) DocumentFieldTerms(id string) (index.FieldTerms, error) { return rv, nil } +func (i *IndexReader) DocumentFieldTermsForFields(id string, fields []string) (index.FieldTerms, error) { + back, err := i.index.backIndexRowForDoc(i.kvreader, id) + if err != nil { + return nil, err + } + rv := make(index.FieldTerms, len(fields)) + fieldsMap := make(map[uint16]string, len(fields)) + for _, f := range fields { + id, ok := i.index.fieldCache.FieldNamed(f, false) + if !ok { + return nil, fmt.Errorf("Field %s was not found in cache", f) + } + fieldsMap[id] = f + } + for _, entry := range back.termEntries { + if field, ok := fieldsMap[uint16(*entry.Field)]; ok { + terms, ok := rv[field] + if !ok { + terms = make([]string, 0) + } + terms = append(terms, *entry.Term) + rv[field] = terms + } + } + return rv, nil +} + func (i *IndexReader) Fields() (fields []string, err error) { fields = make([]string, 0) it := i.kvreader.PrefixIterator([]byte{'f'}) diff --git a/search/facets/facet_builder_datetime.go b/search/facets/facet_builder_datetime.go index 38981464..7e94d523 100644 --- a/search/facets/facet_builder_datetime.go +++ b/search/facets/facet_builder_datetime.go @@ -49,6 +49,10 @@ func (fb *DateTimeFacetBuilder) AddRange(name string, start, end time.Time) { fb.ranges[name] = &r } +func (fb *DateTimeFacetBuilder) Field() string { + return fb.field +} + func (fb *DateTimeFacetBuilder) Update(ft index.FieldTerms) { terms, ok := ft[fb.field] if ok { diff --git a/search/facets/facet_builder_numeric.go b/search/facets/facet_builder_numeric.go index f5acfb0f..a1ac3112 100644 --- a/search/facets/facet_builder_numeric.go +++ b/search/facets/facet_builder_numeric.go @@ -48,6 +48,10 @@ func (fb *NumericFacetBuilder) AddRange(name string, min, max *float64) { fb.ranges[name] = &r } +func (fb *NumericFacetBuilder) Field() string { + return fb.field +} + func (fb *NumericFacetBuilder) Update(ft index.FieldTerms) { terms, ok := ft[fb.field] if ok { diff --git a/search/facets/facet_builder_terms.go b/search/facets/facet_builder_terms.go index 35c56f22..44881390 100644 --- a/search/facets/facet_builder_terms.go +++ b/search/facets/facet_builder_terms.go @@ -32,6 +32,10 @@ func NewTermsFacetBuilder(field string, size int) *TermsFacetBuilder { } } +func (fb *TermsFacetBuilder) Field() string { + return fb.field +} + func (fb *TermsFacetBuilder) Update(ft index.FieldTerms) { terms, ok := ft[fb.field] if ok { diff --git a/search/facets_builder.go b/search/facets_builder.go index f41be294..4d52ec2b 100644 --- a/search/facets_builder.go +++ b/search/facets_builder.go @@ -18,6 +18,7 @@ import ( type FacetBuilder interface { Update(index.FieldTerms) Result() *FacetResult + Field() string } type FacetsBuilder struct { @@ -37,7 +38,11 @@ func (fb *FacetsBuilder) Add(name string, facetBuilder FacetBuilder) { } func (fb *FacetsBuilder) Update(docMatch *DocumentMatch) error { - fieldTerms, err := fb.indexReader.DocumentFieldTerms(docMatch.ID) + var fields []string + for _, facetBuilder := range fb.facets { + fields = append(fields, facetBuilder.Field()) + } + fieldTerms, err := fb.indexReader.DocumentFieldTermsForFields(docMatch.ID, fields) if err != nil { return err }