jiangshuai
2023-11-22 ed81fc8d860adb66676d4990e4ce0ff56cff79a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package blevex
 
import (
    "errors"
    "github.com/huichen/sego"
 
    "github.com/blevesearch/bleve/v2/analysis"
    "github.com/blevesearch/bleve/v2/registry"
)
 
type SegoTokenizer struct {
    segmenter sego.Segmenter
}
 
var _ analysis.Tokenizer = &SegoTokenizer{}
 
func NewSegoTokenizer(dictpath string) *SegoTokenizer {
    segmenter := sego.Segmenter{}
    segmenter.LoadDictionary(dictpath)
    return &SegoTokenizer{segmenter: segmenter}
}
 
func (st *SegoTokenizer) Tokenize(sentence []byte) analysis.TokenStream {
    result := make(analysis.TokenStream, 0)
    pos := 1
    segments := st.segmenter.Segment(sentence)
    for _, segment := range segments {
        token := analysis.Token{
            Term:     []byte(segment.Token().Text()),
            Start:    segment.Start(),
            End:      segment.End(),
            Position: pos,
            Type:     analysis.Ideographic,
        }
        result = append(result, &token)
        pos++
    }
    return result
}
 
func tokenizerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Tokenizer, error) {
    dictpath, ok := config["dictpath"].(string)
    if !ok {
        return nil, errors.New("config dictpath not found")
    }
    return NewSegoTokenizer(dictpath), nil
}
 
func init() {
    registry.RegisterTokenizer("sego", tokenizerConstructor)
}