Render frontmatter as styled cards in public share view

Split search query tokens on word boundaries for accurate inverted-index
matching
This commit is contained in:
2026-05-26 22:16:21 -04:00
parent dc9684e56c
commit 7c4f2964eb
2 changed files with 41 additions and 10 deletions
+15 -9
View File
@@ -762,6 +762,7 @@ def _split_query_tokens(raw: str) -> List[str]:
def _passes_search_filters(
file_info: dict,
query_terms: List[str],
query_terms_raw: List[str],
raw_query: str,
case_sensitive: bool,
whole_word: bool,
@@ -774,6 +775,7 @@ def _passes_search_filters(
content = file_info.get("content", "")
path = file_info.get("path", "")
search_text = f"{title} {content}"
search_text_norm = normalize_text(search_text)
# --- Regex mode ---
if regex and raw_query:
@@ -786,20 +788,20 @@ def _passes_search_filters(
if not pattern.search(search_text):
return False
except re.error:
return False # invalid regex
return False
return _passes_path_filters(path, include_paths, exclude_paths)
# --- Case-sensitive ---
if case_sensitive and query_terms:
for term in query_terms:
# --- Case-sensitive (use raw, non-normalized terms) ---
if case_sensitive and query_terms_raw:
for term in query_terms_raw:
if term not in search_text:
return False
# --- Whole-word ---
# --- Whole-word (use normalized text + normalized terms) ---
if whole_word and query_terms:
for term in query_terms:
pattern = re.compile(rf"\b{re.escape(term)}\b", re.IGNORECASE)
if not pattern.search(search_text):
if not pattern.search(search_text_norm):
return False
# --- Path filters (glob-like) ---
@@ -870,8 +872,12 @@ def advanced_search(
# Vault filter — parsed vault: overrides parameter
effective_vault = parsed["vault"] or vault_filter
# Normalize free-text terms
query_terms = [normalize_text(t) for t in parsed["terms"] if t.strip()]
# Tokenize free-text terms (splits on non-word chars like dots)
# "192.168" → ["192", "168"] for proper inverted index matching
query_terms_raw = [t for t in parsed["terms"] if t.strip()]
query_terms = []
for t in query_terms_raw:
query_terms.extend(tokenize(t))
has_terms = len(query_terms) > 0
if not has_terms and not all_tags and not parsed["title"] and not parsed["path"] and not parsed["ext"]:
@@ -991,7 +997,7 @@ def advanced_search(
if score > 0:
# --- Post-filters: case-sensitive, whole-word, regex, path filters ---
if not _passes_search_filters(
file_info, query_terms, query,
file_info, query_terms, query_terms_raw, " ".join(query_terms_raw) if query_terms_raw else query,
case_sensitive, whole_word, regex, include_paths, exclude_paths
):
continue