если объект найден по реквизиту (колонка в FTS), в выдаче показывается только совпавший реквизит с типом значения — в том же формате дерева
This commit is contained in:
+7
-3
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user