From 7a27dac6851c9eef5a640e591a0e1c6d550cdccb Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期六, 18 十一月 2023 21:10:08 +0800 Subject: [PATCH] 出入库报表支持全文搜索 --- pkg/blevex/bleve.go | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 44 insertions(+), 6 deletions(-) diff --git a/pkg/blevex/bleve.go b/pkg/blevex/bleve.go index 2c06117..3afe948 100644 --- a/pkg/blevex/bleve.go +++ b/pkg/blevex/bleve.go @@ -1,6 +1,7 @@ package blevex import ( + "fmt" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/mapping" "github.com/yanyiwu/gojieba" @@ -72,23 +73,60 @@ } 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.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.NewFuzzyQuery(keyword) + fuzzyQuery.SetFuzziness(2) // Set the fuzziness level as needed + + boolQuery.AddShould(fuzzyQuery) + + // Add a must clause for category filtering + for key, val := range conditions { + query := bleve.NewQueryStringQuery(fmt.Sprintf("%s:%s", 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 { -- Gitblit v1.8.0