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