| | |
| | | package blevex |
| | | |
| | | import ( |
| | | "fmt" |
| | | "github.com/blevesearch/bleve/v2" |
| | | "github.com/blevesearch/bleve/v2/mapping" |
| | | "github.com/yanyiwu/gojieba" |
| | | "sync" |
| | | "time" |
| | | ) |
| | | |
| | | // InitAnalyzer 加载自定义分词器(结巴分词) |
| | | // InitAnalyzer 加载自定义分词器(sego) |
| | | |
| | | var defaultAnalyzer *mapping.IndexMappingImpl |
| | | |
| | | func InitAnalyzer() { |
| | | indexMapping := bleve.NewIndexMapping() |
| | | //os.RemoveAll(IndexDir) |
| | | //// clean index when example finished |
| | | //defer os.RemoveAll(IndexDir) |
| | | |
| | | err := indexMapping.AddCustomTokenizer("gojieba", |
| | | err := indexMapping.AddCustomTokenizer("sego", |
| | | map[string]interface{}{ |
| | | "dictpath": gojieba.DICT_PATH, |
| | | "hmmpath": gojieba.HMM_PATH, |
| | | "userdictpath": gojieba.USER_DICT_PATH, |
| | | "idf": gojieba.IDF_PATH, |
| | | "stop_words": gojieba.STOP_WORDS_PATH, |
| | | "type": "gojieba", |
| | | "dictpath": "conf/dictionary.txt", // 替换为实际的字典路径 |
| | | "type": "sego", |
| | | }, |
| | | ) |
| | | if err != nil { |
| | | panic(err) |
| | | } |
| | | err = indexMapping.AddCustomAnalyzer("gojieba", |
| | | err = indexMapping.AddCustomAnalyzer("sego", |
| | | map[string]interface{}{ |
| | | "type": "gojieba", |
| | | "tokenizer": "gojieba", |
| | | "type": "sego", |
| | | "tokenizer": "sego", |
| | | }, |
| | | ) |
| | | if err != nil { |
| | | panic(err) |
| | | } |
| | | indexMapping.DefaultAnalyzer = "gojieba" |
| | | indexMapping.DefaultAnalyzer = "sego" |
| | | defaultAnalyzer = indexMapping |
| | | } |
| | | |
| | |
| | | } |
| | | return index, err |
| | | } |
| | | func Search(indexName string, keyword string) (ids []string, err error) { |
| | | func Search(indexName string, keyword string, from, size int) (ids []string, total uint64, err error) { |
| | | index, err := LoadIndex(indexName) |
| | | if err != nil { |
| | | return nil, err |
| | | return |
| | | } |
| | | req := bleve.NewSearchRequest(bleve.NewQueryStringQuery(keyword)) |
| | | req := bleve.NewSearchRequest(bleve.NewMatchQuery(keyword)) |
| | | req.From = from |
| | | req.Size = size |
| | | res, err := index.Search(req) |
| | | if err != nil { |
| | | panic(err) |
| | | return nil, 0, err |
| | | } |
| | | if res == nil || res.Total == 0 { |
| | | return ids, nil |
| | | if res == nil { |
| | | return |
| | | } |
| | | for _, ret := range dealResult(res) { |
| | | ids = append(ids, ret.Id) |
| | | } |
| | | return ids, nil |
| | | return ids, res.Total, nil |
| | | } |
| | | |
| | | func ComplexSearch(indexName string, keyword string, conditions map[string]interface{}, from, size int) (ids []string, total uint64, err error) { |
| | | index, err := LoadIndex(indexName) |
| | | if err != nil { |
| | | return nil, 0, err |
| | | } |
| | | |
| | | // Create a boolean query with a should clause for fuzzy search |
| | | boolQuery := bleve.NewBooleanQuery() |
| | | fuzzyQuery := bleve.NewMatchQuery(keyword) |
| | | boolQuery.AddMust(fuzzyQuery) |
| | | |
| | | // Add a must clause for category filtering |
| | | for key, val := range conditions { |
| | | query := bleve.NewQueryStringQuery(fmt.Sprintf("%v:%v", key, val)) |
| | | boolQuery.AddMust(query) |
| | | } |
| | | req := bleve.NewSearchRequest(boolQuery) |
| | | req.From = from |
| | | req.Size = size |
| | | res, err := index.Search(req) |
| | | if err != nil { |
| | | return nil, 0, err |
| | | } |
| | | if res == nil { |
| | | return |
| | | } |
| | | for _, ret := range dealResult(res) { |
| | | ids = append(ids, ret.Id) |
| | | } |
| | | return ids, res.Total, nil |
| | | } |
| | | |
| | | type Result struct { |
| | |
| | | } |
| | | return results |
| | | } |
| | | |
| | | func TimeSearch(indexName string, t time.Time, conditions map[string]interface{}, from, size int) (ids []string, total uint64, err error) { |
| | | index, err := LoadIndex(indexName) |
| | | if err != nil { |
| | | return nil, 0, err |
| | | } |
| | | startDate := t |
| | | endDate := t.Add(time.Hour * 24).Add(-time.Second * 1) |
| | | timeRangeQuery := bleve.NewDateRangeQuery(startDate, endDate) |
| | | boolQuery := bleve.NewBooleanQuery() |
| | | boolQuery.AddMust(timeRangeQuery) |
| | | for key, val := range conditions { |
| | | query := bleve.NewQueryStringQuery(fmt.Sprintf("%v:%v", key, val)) |
| | | boolQuery.AddMust(query) |
| | | } |
| | | |
| | | req := bleve.NewSearchRequest(boolQuery) |
| | | req.From = from |
| | | req.Size = size |
| | | res, err := index.Search(req) |
| | | if err != nil { |
| | | return nil, 0, err |
| | | } |
| | | if res == nil { |
| | | return |
| | | } |
| | | for _, ret := range dealResult(res) { |
| | | ids = append(ids, ret.Id) |
| | | } |
| | | return ids, res.Total, nil |
| | | } |