mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 15:10:12 +01:00
🎨 Support ignore search results https://github.com/siyuan-note/siyuan/issues/10089
This commit is contained in:
parent
2aefead3f0
commit
2ad1662877
2 changed files with 125 additions and 0 deletions
|
|
@ -28,6 +28,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
|
|
@ -906,6 +907,17 @@ func fullTextSearchRefBlock(keyword string, beforeLen int, onlyDoc bool) (ret []
|
||||||
} else {
|
} else {
|
||||||
stmt += " IN " + Conf.Search.TypeFilter()
|
stmt += " IN " + Conf.Search.TypeFilter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ignoreLines := getRefSearchIgnoreLines(); 0 < len(ignoreLines) {
|
||||||
|
// Support ignore search results https://github.com/siyuan-note/siyuan/issues/10089
|
||||||
|
notLike := bytes.Buffer{}
|
||||||
|
for _, line := range ignoreLines {
|
||||||
|
notLike.WriteString(" AND ")
|
||||||
|
notLike.WriteString(line)
|
||||||
|
}
|
||||||
|
stmt += notLike.String()
|
||||||
|
}
|
||||||
|
|
||||||
orderBy := ` order by case
|
orderBy := ` order by case
|
||||||
when name = '${keyword}' then 10
|
when name = '${keyword}' then 10
|
||||||
when alias = '${keyword}' then 20
|
when alias = '${keyword}' then 20
|
||||||
|
|
@ -998,6 +1010,17 @@ func fullTextSearchByFTS(query, boxFilter, pathFilter, typeFilter, orderBy strin
|
||||||
stmt := "SELECT " + projections + " FROM " + table + " WHERE (`" + table + "` MATCH '" + columnFilter() + ":(" + query + ")'"
|
stmt := "SELECT " + projections + " FROM " + table + " WHERE (`" + table + "` MATCH '" + columnFilter() + ":(" + query + ")'"
|
||||||
stmt += ") AND type IN " + typeFilter
|
stmt += ") AND type IN " + typeFilter
|
||||||
stmt += boxFilter + pathFilter
|
stmt += boxFilter + pathFilter
|
||||||
|
|
||||||
|
if ignoreLines := getSearchIgnoreLines(); 0 < len(ignoreLines) {
|
||||||
|
// Support ignore search results https://github.com/siyuan-note/siyuan/issues/10089
|
||||||
|
notLike := bytes.Buffer{}
|
||||||
|
for _, line := range ignoreLines {
|
||||||
|
notLike.WriteString(" AND ")
|
||||||
|
notLike.WriteString(line)
|
||||||
|
}
|
||||||
|
stmt += notLike.String()
|
||||||
|
}
|
||||||
|
|
||||||
stmt += " " + orderBy
|
stmt += " " + orderBy
|
||||||
stmt += " LIMIT " + strconv.Itoa(pageSize) + " OFFSET " + strconv.Itoa((page-1)*pageSize)
|
stmt += " LIMIT " + strconv.Itoa(pageSize) + " OFFSET " + strconv.Itoa((page-1)*pageSize)
|
||||||
blocks := sql.SelectBlocksRawStmt(stmt, page, pageSize)
|
blocks := sql.SelectBlocksRawStmt(stmt, page, pageSize)
|
||||||
|
|
@ -1358,3 +1381,103 @@ func markReplaceSpanWithSplit(text string, keywords []string, replacementStart,
|
||||||
ret = buf.String()
|
ret = buf.String()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
searchIgnoreLastModified int64
|
||||||
|
searchIgnore []string
|
||||||
|
searchIgnoreLock = sync.Mutex{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func getSearchIgnoreLines() (ret []string) {
|
||||||
|
// Support ignore search results https://github.com/siyuan-note/siyuan/issues/10089
|
||||||
|
|
||||||
|
now := time.Now().UnixMilli()
|
||||||
|
if now-searchIgnoreLastModified < 30*1000 {
|
||||||
|
return searchIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
searchIgnoreLock.Lock()
|
||||||
|
defer searchIgnoreLock.Unlock()
|
||||||
|
|
||||||
|
searchIgnoreLastModified = now
|
||||||
|
|
||||||
|
searchIgnorePath := filepath.Join(util.DataDir, ".siyuan", "searchignore")
|
||||||
|
err := os.MkdirAll(filepath.Dir(searchIgnorePath), 0755)
|
||||||
|
if nil != err {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !gulu.File.IsExist(searchIgnorePath) {
|
||||||
|
if err = gulu.File.WriteFileSafer(searchIgnorePath, nil, 0644); nil != err {
|
||||||
|
logging.LogErrorf("create searchignore [%s] failed: %s", searchIgnorePath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data, err := os.ReadFile(searchIgnorePath)
|
||||||
|
if nil != err {
|
||||||
|
logging.LogErrorf("read searchignore [%s] failed: %s", searchIgnorePath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dataStr := string(data)
|
||||||
|
dataStr = strings.ReplaceAll(dataStr, "\r\n", "\n")
|
||||||
|
ret = strings.Split(dataStr, "\n")
|
||||||
|
|
||||||
|
ret = gulu.Str.RemoveDuplicatedElem(ret)
|
||||||
|
if 0 < len(ret) && "" == ret[0] {
|
||||||
|
ret = ret[1:]
|
||||||
|
}
|
||||||
|
searchIgnore = nil
|
||||||
|
for _, line := range ret {
|
||||||
|
searchIgnore = append(searchIgnore, line)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
refSearchIgnoreLastModified int64
|
||||||
|
refSearchIgnore []string
|
||||||
|
refSearchIgnoreLock = sync.Mutex{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func getRefSearchIgnoreLines() (ret []string) {
|
||||||
|
// Support ignore search results https://github.com/siyuan-note/siyuan/issues/10089
|
||||||
|
|
||||||
|
now := time.Now().UnixMilli()
|
||||||
|
if now-refSearchIgnoreLastModified < 30*1000 {
|
||||||
|
return refSearchIgnore
|
||||||
|
}
|
||||||
|
|
||||||
|
refSearchIgnoreLock.Lock()
|
||||||
|
defer refSearchIgnoreLock.Unlock()
|
||||||
|
|
||||||
|
refSearchIgnoreLastModified = now
|
||||||
|
|
||||||
|
searchIgnorePath := filepath.Join(util.DataDir, ".siyuan", "refsearchignore")
|
||||||
|
err := os.MkdirAll(filepath.Dir(searchIgnorePath), 0755)
|
||||||
|
if nil != err {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !gulu.File.IsExist(searchIgnorePath) {
|
||||||
|
if err = gulu.File.WriteFileSafer(searchIgnorePath, nil, 0644); nil != err {
|
||||||
|
logging.LogErrorf("create refsearchignore [%s] failed: %s", searchIgnorePath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data, err := os.ReadFile(searchIgnorePath)
|
||||||
|
if nil != err {
|
||||||
|
logging.LogErrorf("read refsearchignore [%s] failed: %s", searchIgnorePath, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dataStr := string(data)
|
||||||
|
dataStr = strings.ReplaceAll(dataStr, "\r\n", "\n")
|
||||||
|
ret = strings.Split(dataStr, "\n")
|
||||||
|
|
||||||
|
ret = gulu.Str.RemoveDuplicatedElem(ret)
|
||||||
|
if 0 < len(ret) && "" == ret[0] {
|
||||||
|
ret = ret[1:]
|
||||||
|
}
|
||||||
|
refSearchIgnore = nil
|
||||||
|
for _, line := range ret {
|
||||||
|
refSearchIgnore = append(refSearchIgnore, line)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -517,6 +517,8 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func getIndexIgnoreLines() (ret []string) {
|
func getIndexIgnoreLines() (ret []string) {
|
||||||
|
// Support ignore index https://github.com/siyuan-note/siyuan/issues/9198
|
||||||
|
|
||||||
now := time.Now().UnixMilli()
|
now := time.Now().UnixMilli()
|
||||||
if now-indexIgnoreLastModified < 30*1000 {
|
if now-indexIgnoreLastModified < 30*1000 {
|
||||||
return indexIgnore
|
return indexIgnore
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue