@@ -55,6 +55,17 @@ func (s indexWriterSeriesSlice) Less(i, j int) bool {
5555 return labels .Compare (s [i ].labels , s [j ].labels ) < 0
5656}
5757
58+ type symbolFrequencyPair struct {
59+ symbol string
60+ frequency int
61+ }
62+
63+ type symbolFrequencylist []symbolFrequencyPair
64+
65+ func (s symbolFrequencylist ) Len () int { return len (s ) }
66+ func (s symbolFrequencylist ) Swap (i , j int ) { s [i ], s [j ] = s [j ], s [i ] }
67+ func (s symbolFrequencylist ) Less (i , j int ) bool { return s [i ].frequency < s [j ].frequency }
68+
5869type indexWriterStage uint8
5970
6071const (
@@ -330,17 +341,17 @@ func (w *Writer) AddSeries(ref uint64, lset labels.Labels, chunks ...chunks.Meta
330341 return nil
331342}
332343
333- func (w * Writer ) AddSymbols (sym map [string ]struct {} ) error {
344+ func (w * Writer ) AddSymbols (sym map [string ]int ) error {
334345 if err := w .ensureStage (idxStageSymbols ); err != nil {
335346 return err
336347 }
337348 // Generate sorted list of strings we will store as reference table.
338- symbols := make ([] string , 0 , len (sym ))
349+ symbols := make (symbolFrequencylist , 0 , len (sym ))
339350
340- for s := range sym {
341- symbols = append (symbols , s )
351+ for k , v := range sym {
352+ symbols = append (symbols , symbolFrequencyPair { k , v } )
342353 }
343- sort .Strings ( symbols )
354+ sort .Sort ( sort . Reverse ( symbols ) )
344355
345356 const headerSize = 4
346357
@@ -352,8 +363,8 @@ func (w *Writer) AddSymbols(sym map[string]struct{}) error {
352363 w .symbols = make (map [string ]uint32 , len (symbols ))
353364
354365 for index , s := range symbols {
355- w .symbols [s ] = uint32 (index )
356- w .buf2 .putUvarintStr (s )
366+ w .symbols [s . symbol ] = uint32 (index )
367+ w .buf2 .putUvarintStr (s . symbol )
357368 }
358369
359370 w .buf1 .putBE32int (w .buf2 .len ())
@@ -832,11 +843,11 @@ func (r *Reader) lookupSymbol(o uint32) (string, error) {
832843}
833844
834845// Symbols returns a set of symbols that exist within the index.
835- func (r * Reader ) Symbols () (map [string ]struct {} , error ) {
836- res := make (map [string ]struct {} , len (r .symbols ))
846+ func (r * Reader ) Symbols () (map [string ]int , error ) {
847+ res := make (map [string ]int , len (r .symbols ))
837848
838849 for _ , s := range r .symbols {
839- res [s ] = struct {}{}
850+ res [s ] = 0
840851 }
841852 return res , nil
842853}
0 commit comments