diff --git a/CHANGELOG.md b/CHANGELOG.md index b6a096a..edc742d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ ## Не выпущено - Backend обновлён до `0.10.0`: поисковый API использует общий планировщик - запросов, расширяет аббревиатуры ОсОО/ООО/ЖЧК и распознаёт намерение регистрации. + запросов, расширяет аббревиатуры ОсОО/ООО/ЖЧК и для запроса о регистрации + приоритизирует положение КР 2026 года, закон об обществах и ГК КР. - Backend обновлён до `0.9.4`: из поисковых фрагментов убраны технические маркеры подсветки OpenSearch. - Backend обновлён до `0.9.3`: исправлен локальный индекс production Search API, diff --git a/README.md b/README.md index 9bbc213..8c25459 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,13 @@ Telegram-бот — только часть рабочего окружения Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии `0.10.0`. Поиск расширяет аббревиатуры организационно-правовых форм и поднимает -основные нормы о создании и регистрации ОсОО/ЖЧК для запросов об открытии. +положение о регистрации 2026 года, закон об обществах и ГК КР для запросов об +открытии ОсОО/ЖЧК. | Компонент | Версия | Состояние | |---|---:|---| | Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния | -| Backend | `0.10.0` | расширение терминов и учет намерения при поиске регистрации ОсОО/ЖЧК | +| Backend | `0.10.0` | расширение терминов и приоритет действующих актов о регистрации ОсОО/ЖЧК | | Frontend | — | ещё не создан | | Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи | | RAG и база знаний | — | ещё не созданы | diff --git a/backend/search/query.py b/backend/search/query.py index 4548d7e..e750329 100644 --- a/backend/search/query.py +++ b/backend/search/query.py @@ -22,7 +22,7 @@ LEGAL_FORM_ALIASES = { "жоопкерчилиги чектелген коом": ("жчк",), }, } -COMPANY_REGISTRATION_DOCUMENTS = ("667", "4") +COMPANY_REGISTRATION_DOCUMENTS = (("230044970", 3000), ("667", 2000), ("4", 1000)) def query_variants(language: str, query: str) -> list[str]: @@ -75,7 +75,7 @@ def company_registration_clauses(language: str, query: str) -> list[dict]: } } - return [clause(COMPANY_REGISTRATION_DOCUMENTS[0], 2000), clause(COMPANY_REGISTRATION_DOCUMENTS[1], 1000)] + return [clause(code, boost) for code, boost in COMPANY_REGISTRATION_DOCUMENTS] def build_search_query(language: str, query: str) -> dict: @@ -93,7 +93,7 @@ def build_search_query(language: str, query: str) -> dict: ] planned = {"should": [*full_text, *intent_clauses], "minimum_should_match": 1} if intent_clauses: - planned["filter"] = [{"terms": {"document_code": list(COMPANY_REGISTRATION_DOCUMENTS)}}] + planned["filter"] = [{"terms": {"document_code": [code for code, _ in COMPANY_REGISTRATION_DOCUMENTS]}}] return {"bool": planned} diff --git a/backend/test_search_api.py b/backend/test_search_api.py index 0937bb6..627b487 100644 --- a/backend/test_search_api.py +++ b/backend/test_search_api.py @@ -45,7 +45,7 @@ class SearchApiTest(unittest.TestCase): body = json.loads(request.call_args.args[2]) planned = body["query"]["bool"]["must"]["bool"] self.assertEqual(planned["minimum_should_match"], 1) - self.assertIn({"terms": {"document_code": ["667", "4"]}}, planned["filter"]) + self.assertIn({"terms": {"document_code": ["230044970", "667", "4"]}}, planned["filter"]) self.assertTrue(any("constant_score" in clause for clause in planned["should"])) self.assertTrue(any("общество с ограниченной ответственностью" in clause.get("multi_match", {}).get("query", "") for clause in planned["should"])) diff --git a/backend/test_search_relevance.py b/backend/test_search_relevance.py index 036899a..523022f 100644 --- a/backend/test_search_relevance.py +++ b/backend/test_search_relevance.py @@ -55,13 +55,13 @@ class SearchRelevanceTest(unittest.TestCase): body = json.loads(build_search_body(language, query, 10)) search_query = body["query"]["bool"]["must"]["bool"] self.assertEqual(search_query["minimum_should_match"], 1) - self.assertEqual(search_query["filter"], [{"terms": {"document_code": list(COMPANY_REGISTRATION_DOCUMENTS)}}]) + self.assertEqual(search_query["filter"], [{"terms": {"document_code": [code for code, _ in COMPANY_REGISTRATION_DOCUMENTS]}}]) self.assertTrue(all(clause.get("multi_match", {}).get("operator") == "OR" for clause in search_query["should"] if "multi_match" in clause)) boosts = [clause["constant_score"] for clause in search_query["should"] if "constant_score" in clause] - self.assertEqual([item["boost"] for item in boosts], [2000, 1000]) + self.assertEqual([item["boost"] for item in boosts], [boost for _, boost in COMPANY_REGISTRATION_DOCUMENTS]) self.assertEqual( [item["filter"]["bool"]["filter"][0]["term"]["document_code"] for item in boosts], - list(COMPANY_REGISTRATION_DOCUMENTS), + [code for code, _ in COMPANY_REGISTRATION_DOCUMENTS], ) self.assertTrue(all(item["filter"]["bool"]["filter"][1] == {"term": {f"status_{language}": status}} for item in boosts))