zhangqian
2024-07-01 73b6baf6af3d88cdcb0e2df7932a9bd96b0b85c5
pkg/blevex/bleve.go
@@ -1,45 +1,38 @@
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
}
@@ -72,23 +65,57 @@
   }
   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 {
@@ -103,3 +130,34 @@
   }
   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
}