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:
+15
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user