Explorar o código

:art: Return document blocks when the keyword search hits different block content https://github.com/siyuan-note/siyuan/issues/10584

Daniel hai 8 meses
pai
achega
4e407b0ef8

+ 1 - 0
app/appearance/langs/de_DE.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Wenn die Datenmenge groß ist, wird die erste Synchronisation langsam sein. Bitte haben Sie Geduld<br>Wechseln Sie nicht zwischen Apps und halten Sie den Bildschirm während der Synchronisation des iOS/iPad hell.",
   "syncConfGuide5": "Wenn die Datenmenge groß ist, wird die erste Synchronisation langsam sein. Bitte haben Sie Geduld<br>Wechseln Sie nicht zwischen Apps und halten Sie den Bildschirm während der Synchronisation des iOS/iPad hell.",
   "copyPlainText": "Reinen Text kopieren",
   "copyPlainText": "Reinen Text kopieren",
   "findInDoc": "Übereinstimmungen ${y} Blöcke in ${x} Dokumenten",
   "findInDoc": "Übereinstimmungen ${y} Blöcke in ${x} Dokumenten",
+  "matchDoc": "${x} Dokumente gefunden",
   "jumpToParentNext": "Springen Sie zum nächsten Block des übergeordneten Blocks",
   "jumpToParentNext": "Springen Sie zum nächsten Block des übergeordneten Blocks",
   "jumpToParentPrev": "Springen Sie zum vorherigen Block des übergeordneten Blocks",
   "jumpToParentPrev": "Springen Sie zum vorherigen Block des übergeordneten Blocks",
   "jumpToParent": "Springe zu übergeordnetem Block",
   "jumpToParent": "Springe zu übergeordnetem Block",

+ 1 - 0
app/appearance/langs/en_US.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "If the amount of data is large, the first sync will be slow, please wait patiently<br>Do not switch apps and keep the screen bright while the iOS/iPad is syncing",
   "syncConfGuide5": "If the amount of data is large, the first sync will be slow, please wait patiently<br>Do not switch apps and keep the screen bright while the iOS/iPad is syncing",
   "copyPlainText": "Copy plain text",
   "copyPlainText": "Copy plain text",
   "findInDoc": "Matches ${y} blocks in ${x} documents",
   "findInDoc": "Matches ${y} blocks in ${x} documents",
+  "matchDoc": "Matched ${x} documents",
   "jumpToParentNext": "Jump to the next block of the parent block",
   "jumpToParentNext": "Jump to the next block of the parent block",
   "jumpToParentPrev": "Jump to the previous block of the parent block",
   "jumpToParentPrev": "Jump to the previous block of the parent block",
   "jumpToParent": "Jump to parent block",
   "jumpToParent": "Jump to parent block",

+ 1 - 0
app/appearance/langs/es_ES.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Si la cantidad de datos es grande, la primera sincronización será lenta, espere pacientemente<br>No cambie de aplicación y mantenga la pantalla brillante mientras iOS/iPad se sincroniza",
   "syncConfGuide5": "Si la cantidad de datos es grande, la primera sincronización será lenta, espere pacientemente<br>No cambie de aplicación y mantenga la pantalla brillante mientras iOS/iPad se sincroniza",
   "copyPlainText": "Copiar texto sin formato",
   "copyPlainText": "Copiar texto sin formato",
   "findInDoc": "Coincide con bloques ${y} en documentos ${x}",
   "findInDoc": "Coincide con bloques ${y} en documentos ${x}",
+  "matchDoc": "Se encontraron ${x} documentos",
   "jumpToParentNext": "Saltar al siguiente bloque del bloque principal",
   "jumpToParentNext": "Saltar al siguiente bloque del bloque principal",
   "jumpToParentPrev": "Saltar al bloque anterior del bloque principal",
   "jumpToParentPrev": "Saltar al bloque anterior del bloque principal",
   "jumpToParent": "Saltar al bloque principal",
   "jumpToParent": "Saltar al bloque principal",

+ 1 - 0
app/appearance/langs/fr_FR.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Si la quantité de données est importante, la première synchronisation sera lente, veuillez patienter<br> Ne changez pas d'application et gardez l'écran lumineux pendant la synchronisation de l'iOS/iPad",
   "syncConfGuide5": "Si la quantité de données est importante, la première synchronisation sera lente, veuillez patienter<br> Ne changez pas d'application et gardez l'écran lumineux pendant la synchronisation de l'iOS/iPad",
   "copyPlainText": "Copier du texte brut",
   "copyPlainText": "Copier du texte brut",
   "findInDoc": "Correspond à ${y} blocs dans ${x} documents",
   "findInDoc": "Correspond à ${y} blocs dans ${x} documents",
+  "matchDoc": "${x} documents trouvés",
   "jumpToParentNext": "Sauter au bloc suivant du bloc parent",
   "jumpToParentNext": "Sauter au bloc suivant du bloc parent",
   "jumpToParentPrev": "Sauter au bloc précédent du bloc parent",
   "jumpToParentPrev": "Sauter au bloc précédent du bloc parent",
   "jumpToParent": "Sauter au bloc parent",
   "jumpToParent": "Sauter au bloc parent",

+ 1 - 0
app/appearance/langs/he_IL.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "אם הכמות של הנתונים גבוהה, הסנכרון הראשון יתקשח, אנא חכה בסבלנות<br>אל תחליף אפליקציות ושמור על המסך מואר בזמן שמכשירי iOS/iPad בתהליך סנכרון",
   "syncConfGuide5": "אם הכמות של הנתונים גבוהה, הסנכרון הראשון יתקשח, אנא חכה בסבלנות<br>אל תחליף אפליקציות ושמור על המסך מואר בזמן שמכשירי iOS/iPad בתהליך סנכרון",
   "copyPlainText": "העתק טקסט פשוט",
   "copyPlainText": "העתק טקסט פשוט",
   "findInDoc": "התאמות ${y} בלוקים ב${x} מסמכים",
   "findInDoc": "התאמות ${y} בלוקים ב${x} מסמכים",
+  "matchDoc": "נמצאו ${x} מסמכים",
   "jumpToParentNext": "קפוץ לבלוק הבא של הבלוק ההורה",
   "jumpToParentNext": "קפוץ לבלוק הבא של הבלוק ההורה",
   "jumpToParentPrev": "קפוץ לבלוק הקודם של הבלוק ההורה",
   "jumpToParentPrev": "קפוץ לבלוק הקודם של הבלוק ההורה",
   "jumpToParent": "קפוץ לבלוק ההורה",
   "jumpToParent": "קפוץ לבלוק ההורה",

+ 1 - 0
app/appearance/langs/it_IT.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Se la quantità di dati è grande, la prima sincronizzazione sarà lenta, si prega di aspettare con pazienza<br>Non passare ad altre app e mantieni lo schermo acceso mentre si sincronizza su iOS/iPad",
   "syncConfGuide5": "Se la quantità di dati è grande, la prima sincronizzazione sarà lenta, si prega di aspettare con pazienza<br>Non passare ad altre app e mantieni lo schermo acceso mentre si sincronizza su iOS/iPad",
   "copyPlainText": "Copia testo semplice",
   "copyPlainText": "Copia testo semplice",
   "findInDoc": "Corrispondenze ${y} blocchi in ${x} documenti",
   "findInDoc": "Corrispondenze ${y} blocchi in ${x} documenti",
+  "matchDoc": "Trovati ${x} documenti",
   "jumpToParentNext": "Salta al blocco successivo del blocco genitore",
   "jumpToParentNext": "Salta al blocco successivo del blocco genitore",
   "jumpToParentPrev": "Salta al blocco precedente del blocco genitore",
   "jumpToParentPrev": "Salta al blocco precedente del blocco genitore",
   "jumpToParent": "Salta al blocco genitore",
   "jumpToParent": "Salta al blocco genitore",

+ 1 - 0
app/appearance/langs/ja_JP.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "データ量が多い場合は最初の同期が遅くなる場合がありますのでしばらくお待ちください。<br>iOS/iPad で同期している間はアプリを切り替えず画面を明るく保ってください",
   "syncConfGuide5": "データ量が多い場合は最初の同期が遅くなる場合がありますのでしばらくお待ちください。<br>iOS/iPad で同期している間はアプリを切り替えず画面を明るく保ってください",
   "copyPlainText": "プレーンテキストとしてコピー",
   "copyPlainText": "プレーンテキストとしてコピー",
   "findInDoc": "${x} 個のドキュメントの ${y} ブロックと一致します",
   "findInDoc": "${x} 個のドキュメントの ${y} ブロックと一致します",
+  "matchDoc": "${x} 件のドキュメントが見つかりました",
   "jumpToParentNext": "次の親ブロックへ移動",
   "jumpToParentNext": "次の親ブロックへ移動",
   "jumpToParentPrev": "前の親ブロックへ移動",
   "jumpToParentPrev": "前の親ブロックへ移動",
   "jumpToParent": "親ブロックへ移動",
   "jumpToParent": "親ブロックへ移動",

+ 1 - 0
app/appearance/langs/pl_PL.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Jeśli ilość danych jest duża, pierwsza synchronizacja będzie wolna, proszę czekać cierpliwie<br>Nie przełączaj aplikacji i utrzymuj ekran włączony, podczas synchronizacji iOS/iPad",
   "syncConfGuide5": "Jeśli ilość danych jest duża, pierwsza synchronizacja będzie wolna, proszę czekać cierpliwie<br>Nie przełączaj aplikacji i utrzymuj ekran włączony, podczas synchronizacji iOS/iPad",
   "copyPlainText": "Kopiuj tekst zwykły",
   "copyPlainText": "Kopiuj tekst zwykły",
   "findInDoc": "Zgadza się ${y} bloków w ${x} dokumentach",
   "findInDoc": "Zgadza się ${y} bloków w ${x} dokumentach",
+  "matchDoc": "Znaleziono ${x} dokumentów",
   "jumpToParentNext": "Przejdź do następnego bloku rodzica",
   "jumpToParentNext": "Przejdź do następnego bloku rodzica",
   "jumpToParentPrev": "Przejdź do poprzedniego bloku rodzica",
   "jumpToParentPrev": "Przejdź do poprzedniego bloku rodzica",
   "jumpToParent": "Przejdź do bloku rodzica",
   "jumpToParent": "Przejdź do bloku rodzica",

+ 1 - 0
app/appearance/langs/ru_RU.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "Если объем данных большой, первая синхронизация будет медленной, пожалуйста, ожидайте терпеливо<br>Не переключайте приложения и поддерживайте экран ярким, пока iOS/iPad синхронизирует",
   "syncConfGuide5": "Если объем данных большой, первая синхронизация будет медленной, пожалуйста, ожидайте терпеливо<br>Не переключайте приложения и поддерживайте экран ярким, пока iOS/iPad синхронизирует",
   "copyPlainText": "Скопировать обычный текст",
   "copyPlainText": "Скопировать обычный текст",
   "findInDoc": "Соответствует ${y} блокам в ${x} документах",
   "findInDoc": "Соответствует ${y} блокам в ${x} документах",
+  "matchDoc": "Найдено ${x} документов",
   "jumpToParentNext": "Перейти к следующему блоку родительского блока",
   "jumpToParentNext": "Перейти к следующему блоку родительского блока",
   "jumpToParentPrev": "Перейти к предыдущему блоку родительского блока",
   "jumpToParentPrev": "Перейти к предыдущему блоку родительского блока",
   "jumpToParent": "Перейти к родительскому блоку",
   "jumpToParent": "Перейти к родительскому блоку",

+ 1 - 0
app/appearance/langs/zh_CHT.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "如果資料量較大,第一次同步會比較慢,請耐心等待<br>iOS/iPad 端在同步時請勿切換應用並保持螢幕恆亮",
   "syncConfGuide5": "如果資料量較大,第一次同步會比較慢,請耐心等待<br>iOS/iPad 端在同步時請勿切換應用並保持螢幕恆亮",
   "copyPlainText": "複製純文字",
   "copyPlainText": "複製純文字",
   "findInDoc": "${x} 個文件中符合 ${y} 個塊",
   "findInDoc": "${x} 個文件中符合 ${y} 個塊",
+  "matchDoc": "匹配到 ${x} 個文檔",
   "jumpToParentNext": "跳到父塊的下一個塊",
   "jumpToParentNext": "跳到父塊的下一個塊",
   "jumpToParentPrev": "跳到父塊的上一個塊",
   "jumpToParentPrev": "跳到父塊的上一個塊",
   "jumpToParent": "跳到父塊",
   "jumpToParent": "跳到父塊",

+ 1 - 0
app/appearance/langs/zh_CN.json

@@ -531,6 +531,7 @@
   "syncConfGuide5": "如果数据量较大,第一次同步会比较慢,请耐心等待<br>iOS/iPad 端在同步时请勿切换应用并保持亮屏",
   "syncConfGuide5": "如果数据量较大,第一次同步会比较慢,请耐心等待<br>iOS/iPad 端在同步时请勿切换应用并保持亮屏",
   "copyPlainText": "复制纯文本",
   "copyPlainText": "复制纯文本",
   "findInDoc": "${x} 个文档中匹配 ${y} 个块",
   "findInDoc": "${x} 个文档中匹配 ${y} 个块",
+  "matchDoc": "匹配到 ${x} 个文档",
   "jumpToParentNext": "跳转到父块的下一个块",
   "jumpToParentNext": "跳转到父块的下一个块",
   "jumpToParentPrev": "跳转到父块的上一个块",
   "jumpToParentPrev": "跳转到父块的上一个块",
   "jumpToParent": "跳转到父块",
   "jumpToParent": "跳转到父块",

+ 5 - 1
app/src/mobile/menu/search.ts

@@ -204,7 +204,11 @@ ${unicode2Emoji(childItem.ial.icon, "b3-list-item__graphic", true)}
     listElement.scrollTop = 0;
     listElement.scrollTop = 0;
     let countHTML = "";
     let countHTML = "";
     if (response) {
     if (response) {
-        countHTML = `<span class="fn__flex-center">${window.siyuan.languages.findInDoc.replace("${x}", response.data.matchedRootCount).replace("${y}", response.data.matchedBlockCount)}</span>
+        let text = window.siyuan.languages.findInDoc.replace("${x}", response.data.matchedRootCount).replace("${y}", response.data.matchedBlockCount);
+        if (response.data.docMode) {
+            text = window.siyuan.languages.matchDoc.replace("${x}", response.data.matchedRootCount);
+        }
+        countHTML = `<span class="fn__flex-center">${text}</span>
 <span class="fn__flex-1"></span>
 <span class="fn__flex-1"></span>
 <span class="fn__flex-center">${config.page}/${response.data.pageCount || 1}</span>`;
 <span class="fn__flex-center">${config.page}/${response.data.pageCount || 1}</span>`;
     }
     }

+ 5 - 1
app/src/search/util.ts

@@ -1367,8 +1367,12 @@ export const inputEvent = (element: Element, config: Config.IUILayoutTabSearchCo
                     nextElement.setAttribute("disabled", "disabled");
                     nextElement.setAttribute("disabled", "disabled");
                 }
                 }
                 onSearch(response.data.blocks, edit, element, config);
                 onSearch(response.data.blocks, edit, element, config);
+                let text = window.siyuan.languages.findInDoc.replace("${x}", response.data.matchedRootCount).replace("${y}", response.data.matchedBlockCount);
+                if (response.data.docMode) {
+                    text = window.siyuan.languages.matchDoc.replace("${x}", response.data.matchedRootCount);
+                }
                 searchResultElement.innerHTML = `${config.page}/${response.data.pageCount || 1}<span class="fn__space"></span>
                 searchResultElement.innerHTML = `${config.page}/${response.data.pageCount || 1}<span class="fn__space"></span>
-<span class="ft__on-surface">${window.siyuan.languages.findInDoc.replace("${x}", response.data.matchedRootCount).replace("${y}", response.data.matchedBlockCount)}</span>`;
+<span class="ft__on-surface">${text}</span>`;
                 loadingElement.classList.add("fn__none");
                 loadingElement.classList.add("fn__none");
                 searchResultElement.setAttribute("data-pagecount", response.data.pageCount || 1);
                 searchResultElement.setAttribute("data-pagecount", response.data.pageCount || 1);
             });
             });

+ 2 - 1
kernel/api/search.go

@@ -369,12 +369,13 @@ func fullTextSearchBlock(c *gin.Context) {
 	}
 	}
 
 
 	page, pageSize, query, paths, boxes, types, method, orderBy, groupBy := parseSearchBlockArgs(arg)
 	page, pageSize, query, paths, boxes, types, method, orderBy, groupBy := parseSearchBlockArgs(arg)
-	blocks, matchedBlockCount, matchedRootCount, pageCount := model.FullTextSearchBlock(query, boxes, paths, types, method, orderBy, groupBy, page, pageSize)
+	blocks, matchedBlockCount, matchedRootCount, pageCount, docMode := model.FullTextSearchBlock(query, boxes, paths, types, method, orderBy, groupBy, page, pageSize)
 	ret.Data = map[string]interface{}{
 	ret.Data = map[string]interface{}{
 		"blocks":            blocks,
 		"blocks":            blocks,
 		"matchedBlockCount": matchedBlockCount,
 		"matchedBlockCount": matchedBlockCount,
 		"matchedRootCount":  matchedRootCount,
 		"matchedRootCount":  matchedRootCount,
 		"pageCount":         pageCount,
 		"pageCount":         pageCount,
+		"docMode":           docMode,
 	}
 	}
 }
 }
 
 

+ 8 - 7
kernel/model/search.go

@@ -476,7 +476,7 @@ func FindReplace(keyword, replacement string, replaceTypes map[string]bool, ids
 
 
 	if 1 > len(ids) {
 	if 1 > len(ids) {
 		// `Replace All` is no longer affected by pagination https://github.com/siyuan-note/siyuan/issues/8265
 		// `Replace All` is no longer affected by pagination https://github.com/siyuan-note/siyuan/issues/8265
-		blocks, _, _, _ := FullTextSearchBlock(keyword, boxes, paths, types, method, orderBy, groupBy, 1, math.MaxInt)
+		blocks, _, _, _, _ := FullTextSearchBlock(keyword, boxes, paths, types, method, orderBy, groupBy, 1, math.MaxInt)
 		for _, block := range blocks {
 		for _, block := range blocks {
 			ids = append(ids, block.ID)
 			ids = append(ids, block.ID)
 		}
 		}
@@ -903,7 +903,7 @@ func replaceNodeTokens(n *ast.Node, method int, keyword string, replacement stri
 // method:0:关键字,1:查询语法,2:SQL,3:正则表达式
 // method:0:关键字,1:查询语法,2:SQL,3:正则表达式
 // orderBy: 0:按块类型(默认),1:按创建时间升序,2:按创建时间降序,3:按更新时间升序,4:按更新时间降序,5:按内容顺序(仅在按文档分组时),6:按相关度升序,7:按相关度降序
 // orderBy: 0:按块类型(默认),1:按创建时间升序,2:按创建时间降序,3:按更新时间升序,4:按更新时间降序,5:按内容顺序(仅在按文档分组时),6:按相关度升序,7:按相关度降序
 // groupBy:0:不分组,1:按文档分组
 // groupBy:0:不分组,1:按文档分组
-func FullTextSearchBlock(query string, boxes, paths []string, types map[string]bool, method, orderBy, groupBy, page, pageSize int) (ret []*Block, matchedBlockCount, matchedRootCount, pageCount int) {
+func FullTextSearchBlock(query string, boxes, paths []string, types map[string]bool, method, orderBy, groupBy, page, pageSize int) (ret []*Block, matchedBlockCount, matchedRootCount, pageCount int, docMode bool) {
 	ret = []*Block{}
 	ret = []*Block{}
 	if "" == query {
 	if "" == query {
 		return
 		return
@@ -945,7 +945,12 @@ func FullTextSearchBlock(query string, boxes, paths []string, types map[string]b
 		typeFilter := buildTypeFilter(types)
 		typeFilter := buildTypeFilter(types)
 		boxFilter := buildBoxesFilter(boxes)
 		boxFilter := buildBoxesFilter(boxes)
 		pathFilter := buildPathsFilter(paths)
 		pathFilter := buildPathsFilter(paths)
-		blocks, matchedBlockCount, matchedRootCount = fullTextSearchByKeyword(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderByClause, beforeLen, page, pageSize)
+		if 2 > len(strings.Split(query, " ")) {
+			blocks, matchedBlockCount, matchedRootCount = fullTextSearchByQuerySyntax(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderByClause, beforeLen, page, pageSize)
+		} else {
+			docMode = true // 文档全文搜索模式 https://github.com/siyuan-note/siyuan/issues/10584
+			blocks, matchedBlockCount, matchedRootCount = fullTextSearchByKeyword(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderByClause, beforeLen, page, pageSize)
+		}
 	}
 	}
 	pageCount = (matchedBlockCount + pageSize - 1) / pageSize
 	pageCount = (matchedBlockCount + pageSize - 1) / pageSize
 
 
@@ -1290,10 +1295,6 @@ func fullTextSearchByKeyword(query, boxFilter, pathFilter, typeFilter, ignoreFil
 		ret, matchedBlockCount, matchedRootCount = searchBySQL("SELECT * FROM `blocks` WHERE `id` = '"+query+"'", beforeLen, page, pageSize)
 		ret, matchedBlockCount, matchedRootCount = searchBySQL("SELECT * FROM `blocks` WHERE `id` = '"+query+"'", beforeLen, page, pageSize)
 		return
 		return
 	}
 	}
-
-	if 2 > len(strings.Split(query, " ")) {
-		return fullTextSearchByFTS(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderBy, beforeLen, page, pageSize)
-	}
 	return fullTextSearchByFTSWithRoot(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderBy, beforeLen, page, pageSize)
 	return fullTextSearchByFTSWithRoot(query, boxFilter, pathFilter, typeFilter, ignoreFilter, orderBy, beforeLen, page, pageSize)
 }
 }