fix: prioritize current company registration act
This commit is contained in:
@@ -3,7 +3,8 @@
|
|||||||
## Не выпущено
|
## Не выпущено
|
||||||
|
|
||||||
- Backend обновлён до `0.10.0`: поисковый API использует общий планировщик
|
- Backend обновлён до `0.10.0`: поисковый API использует общий планировщик
|
||||||
запросов, расширяет аббревиатуры ОсОО/ООО/ЖЧК и распознаёт намерение регистрации.
|
запросов, расширяет аббревиатуры ОсОО/ООО/ЖЧК и для запроса о регистрации
|
||||||
|
приоритизирует положение КР 2026 года, закон об обществах и ГК КР.
|
||||||
- Backend обновлён до `0.9.4`: из поисковых фрагментов убраны технические маркеры
|
- Backend обновлён до `0.9.4`: из поисковых фрагментов убраны технические маркеры
|
||||||
подсветки OpenSearch.
|
подсветки OpenSearch.
|
||||||
- Backend обновлён до `0.9.3`: исправлен локальный индекс production Search API,
|
- Backend обновлён до `0.9.3`: исправлен локальный индекс production Search API,
|
||||||
|
|||||||
@@ -11,12 +11,13 @@ Telegram-бот — только часть рабочего окружения
|
|||||||
|
|
||||||
Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии
|
Сейчас реализованы Telegram-бот-секретарь версии `0.2.2` и backend версии
|
||||||
`0.10.0`. Поиск расширяет аббревиатуры организационно-правовых форм и поднимает
|
`0.10.0`. Поиск расширяет аббревиатуры организационно-правовых форм и поднимает
|
||||||
основные нормы о создании и регистрации ОсОО/ЖЧК для запросов об открытии.
|
положение о регистрации 2026 года, закон об обществах и ГК КР для запросов об
|
||||||
|
открытии ОсОО/ЖЧК.
|
||||||
|
|
||||||
| Компонент | Версия | Состояние |
|
| Компонент | Версия | Состояние |
|
||||||
|---|---:|---|
|
|---|---:|---|
|
||||||
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
|
| Telegram-бот | `0.2.2` | на Synology работает `0.2.1`; обновление после слияния |
|
||||||
| Backend | `0.10.0` | расширение терминов и учет намерения при поиске регистрации ОсОО/ЖЧК |
|
| Backend | `0.10.0` | расширение терминов и приоритет действующих актов о регистрации ОсОО/ЖЧК |
|
||||||
| Frontend | — | ещё не создан |
|
| Frontend | — | ещё не создан |
|
||||||
| Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи |
|
| Сбор и обработка правовых данных | `0.8.0` | добавлены relevance set и оценка выдачи |
|
||||||
| RAG и база знаний | — | ещё не созданы |
|
| RAG и база знаний | — | ещё не созданы |
|
||||||
|
|||||||
@@ -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]:
|
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:
|
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}
|
planned = {"should": [*full_text, *intent_clauses], "minimum_should_match": 1}
|
||||||
if intent_clauses:
|
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}
|
return {"bool": planned}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class SearchApiTest(unittest.TestCase):
|
|||||||
body = json.loads(request.call_args.args[2])
|
body = json.loads(request.call_args.args[2])
|
||||||
planned = body["query"]["bool"]["must"]["bool"]
|
planned = body["query"]["bool"]["must"]["bool"]
|
||||||
self.assertEqual(planned["minimum_should_match"], 1)
|
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("constant_score" in clause for clause in planned["should"]))
|
||||||
self.assertTrue(any("общество с ограниченной ответственностью" in clause.get("multi_match", {}).get("query", "") for clause in planned["should"]))
|
self.assertTrue(any("общество с ограниченной ответственностью" in clause.get("multi_match", {}).get("query", "") for clause in planned["should"]))
|
||||||
|
|
||||||
|
|||||||
@@ -55,13 +55,13 @@ class SearchRelevanceTest(unittest.TestCase):
|
|||||||
body = json.loads(build_search_body(language, query, 10))
|
body = json.loads(build_search_body(language, query, 10))
|
||||||
search_query = body["query"]["bool"]["must"]["bool"]
|
search_query = body["query"]["bool"]["must"]["bool"]
|
||||||
self.assertEqual(search_query["minimum_should_match"], 1)
|
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))
|
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]
|
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(
|
self.assertEqual(
|
||||||
[item["filter"]["bool"]["filter"][0]["term"]["document_code"] for item in boosts],
|
[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))
|
self.assertTrue(all(item["filter"]["bool"]["filter"][1] == {"term": {f"status_{language}": status}} for item in boosts))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user