From 05c2696e0afe4f2785592858655d25d54d4847c0 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 17 Feb 2023 14:23:06 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E4=BD=BF=E7=94=A8=20AC=20=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E4=BC=98=E5=8C=96=E8=99=9A=E6=8B=9F=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/go.mod | 1 + kernel/go.sum | 2 ++ kernel/model/virutalref.go | 23 ++++++++++++++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/kernel/go.mod b/kernel/go.mod index a356f8e2c..5f703f748 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -65,6 +65,7 @@ require ( github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef // indirect github.com/aws/aws-sdk-go v1.44.199 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cloudflare/ahocorasick v0.0.0-20210425175752-730270c3e184 // indirect github.com/dlclark/regexp2 v1.8.0 // indirect github.com/dsnet/compress v0.0.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect diff --git a/kernel/go.sum b/kernel/go.sum index 3e1b8c43f..df5f3f4d9 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -42,6 +42,8 @@ github.com/aws/aws-sdk-go v1.44.199/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/ahocorasick v0.0.0-20210425175752-730270c3e184 h1:8yL+85JpbwrIc6m+7N1iYrjn/22z68jwrTIBOJHNe4k= +github.com/cloudflare/ahocorasick v0.0.0-20210425175752-730270c3e184/go.mod h1:tGWUZLZp9ajsxUOnHmFFLnqnlKXsCn6GReG4jAD59H0= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= diff --git a/kernel/model/virutalref.go b/kernel/model/virutalref.go index d1060e9e8..674d33c72 100644 --- a/kernel/model/virutalref.go +++ b/kernel/model/virutalref.go @@ -27,6 +27,7 @@ import ( "github.com/88250/lute" "github.com/88250/lute/ast" "github.com/88250/lute/parse" + "github.com/cloudflare/ahocorasick" "github.com/dgraph-io/ristretto" "github.com/siyuan-note/siyuan/kernel/search" "github.com/siyuan-note/siyuan/kernel/sql" @@ -69,17 +70,25 @@ func putBlockVirtualRefKeywords(blockContent, blockID, docTitle string) (ret []s } contentTmp := blockContent + keywordsTmp := keywords if !Conf.Search.CaseSensitive { contentTmp = strings.ToLower(blockContent) - } - for _, keyword := range keywords { - keywordTmp := keyword - if !Conf.Search.CaseSensitive { - keywordTmp = strings.ToLower(keyword) + for i, keyword := range keywordsTmp { + keywordsTmp[i] = strings.ToLower(keyword) } + } - if strings.Contains(contentTmp, keywordTmp) { - ret = append(ret, keyword) + if 1024*1024 < len(contentTmp) { + matcher := ahocorasick.NewStringMatcher(keywords) + hits := matcher.Match([]byte(contentTmp)) + for _, hit := range hits { + ret = append(ret, keywords[hit]) + } + } else { + for _, keyword := range keywordsTmp { + if strings.Contains(contentTmp, keyword) { + ret = append(ret, keyword) + } } }