если объект найден по реквизиту (колонка в FTS), в выдаче показывается только совпавший реквизит с типом значения — в том же формате дерева

This commit is contained in:
mihailkudravcev
2026-07-17 16:56:15 +03:00
parent 404659a545
commit 06e13395f8
6 changed files with 239 additions and 53 deletions
+7 -3
View File
@@ -10,6 +10,7 @@ from typing import Any
from . import db as dbmod
from .config import cache_dir
from .object_view import annotate_search_hits
def _fts_query(raw: str) -> str:
@@ -266,7 +267,8 @@ def search_objects(
limit: int = 30,
) -> list[dict[str, Any]]:
exact_sql = """
SELECT config, full_name, object_type, name, synonym, comment, path, '' AS snip, -100.0 AS score
SELECT config, full_name, object_type, name, synonym, comment, path,
id AS object_id, '' AS snip, -100.0 AS score
FROM objects
WHERE (name = ? OR full_name = ? OR full_name LIKE ?)
"""
@@ -286,6 +288,7 @@ def search_objects(
fetch_n = max(limit * 5, 50)
sql = """
SELECT o.config, o.full_name, o.object_type, o.name, o.synonym, o.comment, o.path,
o.id AS object_id,
snippet(objects_fts, 0, '[', ']', '', 12) AS snip,
bm25(objects_fts, 10.0, 5.0, 2.0, 1.0) AS score
FROM objects_fts
@@ -307,7 +310,8 @@ def search_objects(
except sqlite3.OperationalError:
like = f"%{query}%"
sql2 = """
SELECT config, full_name, object_type, name, synonym, comment, path, '' AS snip, 0 AS score
SELECT config, full_name, object_type, name, synonym, comment, path,
id AS object_id, '' AS snip, 0 AS score
FROM objects
WHERE full_name LIKE ? OR synonym LIKE ? OR comment LIKE ? OR name LIKE ?
"""
@@ -343,7 +347,7 @@ def search_objects(
merged.sort(
key=lambda x: (x.get("_boost", 9), x.get("score") if x.get("score") is not None else 0)
)
return merged[:limit]
return annotate_search_hits(conn, merged[:limit], query)
def search_modules(