Improve tax profit search relevance

This commit is contained in:
2026-09-16 22:31:35 +03:00
parent 47d51cd36b
commit 14e86ccdd8
11 changed files with 81 additions and 44 deletions

View File

@@ -5,7 +5,7 @@ from pathlib import Path
from unittest.mock import patch
from search.evaluate_relevance import evaluate, load_queries
from search.query import COMPANY_REGISTRATION_DOCUMENTS, build_search_body, query_variants
from search.query import COMPANY_REGISTRATION_DOCUMENTS, TAX_PROFIT_DOCUMENTS, build_search_body, query_variants
class SearchRelevanceTest(unittest.TestCase):
@@ -38,9 +38,9 @@ class SearchRelevanceTest(unittest.TestCase):
self.assertFalse(body["track_total_hits"])
self.assertEqual(body["collapse"], {"field": "document_code"})
self.assertIn({"term": {"is_current_edition": True}}, body["query"]["bool"]["filter"])
lexical_query = body["query"]["bool"]["must"]["bool"]["should"][0]["multi_match"]
self.assertEqual(lexical_query["type"], "cross_fields")
lexical_query = body["query"]["bool"]["must"]["bool"]["should"][0]["match"]["text_ru"]
self.assertEqual(lexical_query["operator"], "AND")
self.assertTrue(any("match_phrase" in clause for clause in body["query"]["bool"]["must"]["bool"]["should"]))
def test_legal_form_abbreviations_expand_in_both_directions(self):
self.assertIn("как открыть общество с ограниченной ответственностью", query_variants("ru", "как открыть ОсОО"))
@@ -56,7 +56,8 @@ class SearchRelevanceTest(unittest.TestCase):
search_query = body["query"]["bool"]["must"]["bool"]
self.assertEqual(search_query["minimum_should_match"], 1)
self.assertNotIn("filter", search_query)
self.assertTrue(all(clause.get("multi_match", {}).get("operator") == "OR" for clause in search_query["should"] if "multi_match" in clause))
lexical = [clause["match"] for clause in search_query["should"] if "match" in clause]
self.assertTrue(all(next(iter(clause.values()))["operator"] == "OR" for clause in lexical))
boosts = [clause["constant_score"] for clause in search_query["should"] if "constant_score" in clause]
self.assertEqual([item["boost"] for item in boosts], [boost for _, boost in COMPANY_REGISTRATION_DOCUMENTS])
self.assertEqual(
@@ -65,6 +66,20 @@ class SearchRelevanceTest(unittest.TestCase):
)
self.assertTrue(all(item["filter"]["bool"]["filter"][1] == {"term": {f"status_{language}": status}} for item in boosts))
def test_profit_tax_intent_prioritizes_the_current_tax_code(self):
for query in ("налог на прибыль", "налога на прибыль организаций", "налогообложение прибыли"):
body = json.loads(build_search_body("ru", query, 10))
clauses = body["query"]["bool"]["must"]["bool"]["should"]
boosts = [clause["constant_score"] for clause in clauses if "constant_score" in clause]
self.assertEqual([item["boost"] for item in boosts], [boost for _, boost in TAX_PROFIT_DOCUMENTS])
self.assertEqual([item["filter"]["bool"]["filter"][0]["term"]["document_code"] for item in boosts], ["112340"])
self.assertTrue(all(item["filter"]["bool"]["filter"][1] == {"term": {"status_ru": "Действует"}} for item in boosts))
for query in ("прибыль организации", "налог на доходы", "налог на имущество"):
body = json.loads(build_search_body("ru", query, 10))
clauses = body["query"]["bool"]["must"]["bool"]["should"]
self.assertFalse(any("constant_score" in clause for clause in clauses))
def test_company_registration_intent_ignores_non_procedural_queries(self):
for language, query in (
("ru", "ОсОО зарегистрирован?"),